System.Data.SQLite BadImageFormatException 与 NHibernate,独立时工作正常

发布于 2024-12-01 18:49:23 字数 1015 浏览 1 评论 0原文

我尝试将 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>

I tried to use NHibernate with SQLite,
version=1.0.74.0 for .NET 4 and 32 bit.
I use a 64bit WIN7, but build the application in x86 mode
(default in VS2010 express).

When I use the same SQLite as a standalone application it works fine, but when
I try to use it with NHibernate it throws BadImageFormatExcepion

I debugged a bit NHibernate and the Exception is thrown at the folllowing statement

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

Any chances somebody knows the solution?
Is it because I use default mode in VS Express?
Do I need to specify platform using some other method?
try to download some other dll for sqlite?

I checked some other answers on SO thebest I got was
to add to my app.config this:

  <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>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

り繁华旳梦境 2024-12-08 18:49:23

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

<PlatformTarget>x86</PlatformTarget>

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

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

另外,请尝试从配置中删除 useLegacyV2RuntimeActivationPolicy

来自 BadImageFormatException 文档:

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

If VS express does not allow you to choose a platform you can try setting it up manually in .csproj file

<PlatformTarget>x86</PlatformTarget>

After building your app make sure that:

  • it is executed as 32 or 64 bit app depending on what you put in PlatformTarget (using Windows Task Manager or Process Explorer)
  • the right version of SQLite.Interop.dll is copied to the folder where you have your exe (this dll is platform dependent, so you need to copy the version corresponding to EXE platform)
  • Corresponding version of Visual C++ 2010 SP1 Redistributable Package is installed

Also try removing useLegacyV2RuntimeActivationPolicy from config.

From BadImageFormatException doc:

... A DLL or executable is loaded as a 64-bit assembly, but it contains
32-bit features or resources. For example, it relies on COM interop or
calls methods in a 32-bit dynamic link library. ... To address this exception, set the project's Platform target property to x86 (instead of x64 or AnyCPU) and recompile.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文