【问题标题】:System.Data.SQLite BadImageFormatException with NHibernate, works finewhen standalone带有 NHibernate 的 System.Data.SQLite BadImageFormatException,独立时工作正常
【发布时间】:2011-11-05 08:38:58
【问题描述】:

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

【问题讨论】:

    标签: nhibernate sqlite x86 badimageformatexception typeloadexception


    【解决方案1】:

    如果 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 位动态链接库中的方法。 ...要解决此异常,请将项目的 Platform 目标属性设置为 x86(而不是 x64 或 AnyCPU)并重新编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-21
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-11
      • 1970-01-01
      相关资源
      最近更新 更多