使用 .NET 3.5 生成的 exe 文件无法加载使用 .NET 4.5 创建的 dll?

Posted

技术标签:

【中文标题】使用 .NET 3.5 生成的 exe 文件无法加载使用 .NET 4.5 创建的 dll?【英文标题】:exe file generated using .NET 3.5 cannot load dll created using .NET 4.5? 【发布时间】:2013-11-28 05:06:11 【问题描述】:

我有一个使用 .NET 3.5 版本生成的 exe 文件。我没有这个的源代码,我只有这个exe文件。此 exe 文件加载某些 dll 文件。其中一个 dll 文件是使用 .NET 4.5 生成的。这不能做吗? 我收到错误“此程序集由比当前加载的运行时更新的运行时构建,无法加载。”

在我的 exe 文件配置文件中,我确实有所有 3 个版本的“supportedRuntime”条目

<supportedRuntime version="v2.0.50727"/>
<supportedRuntime version="v4.0"/>
<supportedRuntime version="v4.5"/>

我认为通过添加上述内容将有助于旧版本开发的控制台应用程序可以加载使用新版本开发的 dll 文件。我对么?如果没有,有什么解决办法?

【问题讨论】:

一点研究表明这个问题是不可避免的,因为 .NET 框架不向前兼容。您需要使用与目标应用程序兼容的框架版本(可能是 3.5)来编译您的程序集。不,配置行不会影响应用程序加载应用程序的能力。 【参考方案1】:

我不知道为什么每个人都说这不能做到,因为它肯定可以做到。关于配置文件,您需要修复两件事。一是最喜欢的运行时必须排在第一位。如果您将 .NET 4.5 放在最后,它将尝试首先加载 .NET 2.0 运行时,如果已安装,请使用它。当您尝试加载不兼容的 dll 时,结果是 BadImageFormatException。第二个问题是 .NET 4.5 是对 .NET 4.0 的就地升级,因此语法略有不同。正确的格式是这样的:

<startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>    
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>    
    <supportedRuntime version="v2.0.50727"/>
</startup>

注意sku 属性的使用。例如,如果您需要使用 4.0 客户端配置文件,docs 中有更多信息。

现在你没有编写 exe,所以你实际上不知道它是否真的可以在 .Net 4.5 中工作(它可能不会)所以这有点危险。警告购买者。

【讨论】:

【参考方案2】:

您似乎需要编译新的程序集引用来创建 DLL 文件,其框架版本为 3.5,它与您使用框架版本 3.5 创建的应用程序兼容。

【讨论】:

【参考方案3】:

显然您的 DotNet35.exe 被 CLR 2 锁定,当它启动时,它使用 CLR 2,无法通过反射使用 PluginDotNet45.dll。是的,我认为涉及到反射。

取决于 DotNet35.exe 的设计,这样的解决方法可能是可能的: 1. 使用 .NET Framework 4.5 编写一个名为 DotNet45.exe 的新 exe,该 exe 将引用 DotNet35.exe 作为普通程序集。 2. DotNet45.exe会使用DotNet35.exe中的一些函数来显示GUI和加载插件,包括使用.NET 4.5构建的插件。

如果 DotNet35.exe 没有很多可见的函数可以使用,您可以在通过 ILSpy 检查后使用反射来调用一些私有函数。

另一种方法是将 DotNet35.exe 反编译为 C# 代码,然后使用 .NET 4.5 进行编译。

【讨论】:

以上是关于使用 .NET 3.5 生成的 exe 文件无法加载使用 .NET 4.5 创建的 dll?的主要内容,如果未能解决你的问题,请参考以下文章

无法安装net framework 3.5 无法连接Internet 的解决方法

c#如何生成不依赖NET平台的exe?要打包的话如何打包?

改变 WIX 生成的 .NET 3.5 引导程序的行为

VB.NET编好程序后一运行就提示生成错误,重装VB好几遍了还是不行

从 3.5 调用 .NET 4 库

WCF 与 3.5 和 4.0 一起使用