我有一个使用.NET 4.0构建的Windows窗体项目。它引用了一个使用.NET 2.0构建的DLL System.Data.SQLite。当我的exe文件部署到只安装.NET Framework 4.0的客户机(Windows XP)上时,exe崩溃了。
我该如何强制EXE将引用的DLL加载到CLR 4.0中(尽管它是构建为使用CLR 2.0),以便在没有安装.NET Framework 2.0的情况下仍然能够运行?
我有一个使用.NET 4.0构建的Windows窗体项目。它引用了一个使用.NET 2.0构建的DLL System.Data.SQLite。当我的exe文件部署到只安装.NET Framework 4.0的客户机(Windows XP)上时,exe崩溃了。
我该如何强制EXE将引用的DLL加载到CLR 4.0中(尽管它是构建为使用CLR 2.0),以便在没有安装.NET Framework 2.0的情况下仍然能够运行?
在你的 app.config 中将 useLegacyV2RuntimeActivationPolicy
设置为 true
(更多信息)。
关于 .NET 4 上 SQLite(尤其是 EF4),我在我的博客中有更多信息。
John
我也遇到了配置SQLite的问题,我使用NHibernate而不是EntityFramework(我认为最新版本可能更多地考虑了EF,但不确定)。以下是目前适用于我的方法。
1)像Stephen所说,修改app.config,但还要添加一个运行时指令,原因在下面的注释中。
2)首先将构建目标平台与适合您需求的dll匹配。64x或86x都可以工作,但AnyCpu会出现某种清单异常。我勉强使用x86,因为它更安全,对我正在做的任何事情都没有明显影响。
您甚至可能会发现,在最新版本(我认为是四月份)中,制作单独的项目以隔离依赖关系问题非常有用。不要期望通过Visual Studio执行太多WPF视图,因为XAML设计器不会很开心。一旦开始运行,它就快速而简洁,但最新版本并不是易如反掌。
希望对您有所帮助,
Berryl
完整的app config添加内容
<!-- 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>
将 .Net 4 设置为完整配置文件,请参见此处 msdn.microsoft.com/en-us/library/cc656912.aspx
右键单击项目 > 属性 > 编译选项卡 > 高级编译选项 > 目标框架。确保它没有设置为 .Net Client > 将其设置为 .Net 4(完整版)
编辑:.NET Framework 通常具有向后兼容性,您可以设置支持的运行时,请参见此处 http://social.msdn.microsoft.com/forums/en-US/clr/thread/de5956f6-7a12-45d8-ae03-988ad8434a17
关于崩溃的 EXE,我猜测这是一个二次机会异常(即调试器无法处理的异常),因此您可能需要获取内存转储并使用 WinDBG 来 !分析内存转储并找出确切的原因,除非二次机会异常消息列出 System.Data.SQLite 作为问题 DLL。