使用.NET Framework 4.0与使用2.0的程序集

4

我有一个使用.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的情况下仍然能够运行?


2
你得到了什么异常?你的代码应该可以正常工作。 - SLaks
3个回答

4

很好的信息,我以为SQLite是纯管理代码。希望这可以解决我的客户问题。我会让他们尝试一下。 - John Kenedy

1

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>

将所有内容放在<configuration>...</configuration>中,在应用程序加载时被识别。 - lsalamon

0

将 .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。


你怎么知道的?不管怎样,我编辑了一下,包括WinDBG的东西:) - Jeremy Thompson
楼主写道:“如何强制EXE加载引用的DLL到CLR 4.0”- 所以我认为他在尝试将SQLLite DLL引用到项目中时遇到了问题,而客户端配置文件是该问题的典型原因。无论如何,没有什么损失:) - Jeremy Thompson
嗨,我非常怀疑是SQLite的问题,因为在我使用SQLite之前,它在我的客户端电脑上运行良好,该电脑仅安装了.NET Framework 4.0。在我引用SQLite之后,问题开始出现。请问客户端和完整档案之间有什么区别,对EXE会产生什么影响? - John Kenedy
不要重复好的答案,这里有链接:https://dev59.com/mHE85IYBdhLWcg3wejZO。John像Slaks一样问,你能把异常复制粘贴到你的问题中吗?谢谢。你知道SQLLite引用了Mono.Security.DLL,我在某个地方读到过(据我所知是Miguel de Icaza),Mono组件可以在.Net框架下运行,反之亦然。不确定是否适用于具有“支持的运行时标记”的不同版本DLL,正如Stephen和我所提到的那样。如果在客户系统上安装.Net 2.0,是否会出现问题? - Jeremy Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接