2

我尝试将 NHibernate 与 SQLite 一起使用,对于 .NET 4 和 32 位,版本 = 1.0.74.0。我使用 64 位 WIN7,但在 x86 模式下构建应用程序(VS2010 express 中的默认值)。

当我将相同的 SQLite 用作独立应用程序时,它可以正常工作,但是当我尝试将它与 NHibernate 一起使用时,它会抛出BadImageFormatExcepion

我调试了一点 NHibernate 并在以下语句中引发了异常

System.Type.GetType("System.Data.SQLite.SQLiteConnection, System.Data.SQLite");

有人知道解决方案的机会吗?是因为我在 VS Express 中使用默认模式吗?我是否需要使用其他方法指定平台?尝试为sqlite下载其他一些dll?

我检查了一些其他的答案,所以我得到的最好的是将这个添加到我的 app.config 中:

  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite"/>
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite"/>
    </DbProviderFactories>
  </system.data>



 <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
4

1 回答 1

2

如果 VS express 不允许您选择平台,您可以尝试在 .csproj 文件中手动设置

<PlatformTarget>x86</PlatformTarget>

构建您的应用程序后,请确保:

  • 它作为 32 位或 64 位应用程序执行,具体取决于您在 PlatformTarget 中放置的内容(使用 Windows 任务管理器或进程资源管理器)
  • 将正确版本的SQLite.Interop.dll复制到您的 exe 所在的文件夹中(此 dll 是平台相关的,因此您需要复制与 EXE 平台对应的版本)
  • 安装了对应版本的Visual C++ 2010 SP1 Redistributable Package

也尝试useLegacyV2RuntimeActivationPolicy从配置中删除。

来自BadImageFormatException文档:

... DLL 或可执行文件作为 64 位程序集加载,但它包含 32 位功能或资源。例如,它依赖于 COM 互操作或调用 32 位动态链接库中的方法。...要解决此异常,请将项目的平台目标属性设置为 x86(而不是 x64 或 AnyCPU)并重新编译。

于 2011-08-28T05:50:30.340 回答