【问题标题】:.NET Framework 4.0 with assemblies using 2.0.NET Framework 4.0 和使用 2.0 的程序集
【发布时间】:2010-12-08 02:26:13
【问题描述】:

我有一个在 .NET 4.0 中构建的 Windows 窗体项目。它指的是在 .NET 2.0 中构建的 DLL System.Data.SQLite。当我的 exe 文件部署到我的客户(在他的机器(Windows XP)中只安装 .NET Framework 4.0)时,exe 崩溃。

如何强制 EXE 将引用的 DLL 加载到 CLR 4.0(尽管它是为使用 CLR 2.0 而构建的),以便在未安装 .NET Framework 2.0 的情况下仍然能够运行?

【问题讨论】:

  • 你得到什么异常?您的代码应该可以正常工作。

标签: .net winforms sqlite frameworks


【解决方案1】:

在您的 app.config (more info) 中将 useLegacyV2RuntimeActivationPolicy 设置为 true

我有更多关于 .NET 4(尤其是 EF4)上的 SQLite 的信息on my blog

【讨论】:

  • 好消息,我认为 SQLite 是纯托管代码。希望这可以解决我的客户问题。会请他们试一试。
【解决方案2】:

约翰

我在配置 SQLite 时也遇到了问题,我使用 NHibernate 而不是 EntityFramework(我认为上一个版本可能更多地考虑了 EF,不确定)。这是目前对我有用的。

1) 像 Stephen 所说的那样修改 app.config,但还要在下面的 cmets 中添加一个运行时指令。

2) 首先将您的构建目标平台与适合您需求的 dll 匹配。 64x 或 86x 都可以,但 AnyCpu 会出现某种明显的异常。我不情愿地使用 x86,因为它更安全,并且不会明显影响我用它做的任何事情。

您甚至可能会发现在某些时候创建单独的项目以隔离最新版本中的依赖问题很有用(我认为是 4 月)。也不要期望通过 Visual Studio 对任何 WPF 视图做太多事情,因为 XAML 设计器不会高兴。一旦你开始使用它就会快速而甜蜜,但最新版本并不是一件容易的事。

HTH,
浆果

完整的应用配置添加

<!-- SQLite requires this mixed mode load setting-->
<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>

<runtime>
    <loadFromRemoteSources enabled="true"/>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

    <!-- SQLite is built with older System.Data so we need this redirect -->       
    <dependentAssembly>
        <assemblyIdentity name="System.Data" publicKeyToken="b77a5c561934e089"/>
        <bindingRedirect oldVersion="2.0.0.0" newVersion="4.0.0.0"/>
    </dependentAssembly>

    </assemblyBinding>
</runtime>

【讨论】:

  • 将所有内容放入 ... ,以便在应用程序加载时识别。
【解决方案3】:

将 .Net 4 设置为完整配置文件,请参阅此处 msdn.microsoft.com/en-us/library/cc656912.aspx

右键单击项目 > Proeprties > 编译选项卡 > 高级编译选项 > 目标框架。确保未将其设置为 .Net Client > 将其设置为仅 .Net 4 (Full)

编辑:.NET Framework 通常向后兼容,您可以设置支持的运行时,请参阅此处http://social.msdn.microsoft.com/forums/en-US/clr/thread/de5956f6-7a12-45d8-ae03-988ad8434a17

关于崩溃的 EXE,我猜这是第二次机会异常(即调试器无法处理的异常),因此您可能需要进行内存转储并使用 WinDBG !分析内存转储并找出确切的原因,除非第二次机会异常消息将 System.Data.SQLite 列为问题 DLL。

【讨论】:

  • 你怎么知道的?无论如何我编辑包括WinDBG的东西:)
  • OP 写道:“我如何强制 EXE 将引用的 DLL 加载到 CLR 4.0 中” - 所以我认为他在将 SQLLite DLL 引用到他的项目中时遇到了问题,并且客户端配置文件是该问题的典型原因。无论如何,没有伤害没有犯规:)
  • 嗨,我高度怀疑它是 SQLite,因为在我使用 SQLite 之前,它在我只安装了 .NET Framework 4.0 的客户端计算机上运行良好。在我引用 SQLite 之后,问题开始发生。我可以知道客户端与完整配置文件之间的区别以及它对 EXE 的影响吗?
  • 不要在这里重复一个好的答案:stackoverflow.com/questions/2759228/…。约翰正如 Slaks 所问,您能否将异常复制并粘贴到您的问题中?谢谢。您知道 SQLLite 引用了 Mono.Security.DLL,我在某处(Miguel de Icaza 的 afaik)读到 Mono 组件可以在 .Net 框架下运行,反之亦然。不确定这是否适用于斯蒂芬和我提到的具有“支持的运行时标签”的不同版本的 DLL。如果您在客户端系统上安装 .Net 2.0,是否会出现问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多