让使用.NET 2.0构建的C#应用程序在.NET 4.0/4.5上运行

16
我们有一个 C# DLL(我们称之为myapp.exe),它是使用 .NET 2.0 Framework(VS2005)构建的。我们发现我们的应用程序无法在只安装了 .NET 4.0 或更高版本的计算机上运行。为了让我们的应用程序在 .NET 4.0 上工作,我按照这篇文章Installing .NET Framework V4.0 and Running .NET 2.0/3.0/3.5/3.5Sp1 Applications中的步骤向myapp.exe.config文件添加了以下几行代码。
<startup>
  <supportedRuntime version="v4.0.30319"/>    
</startup>

它正在运行。

然后我发现这篇文章还提到了以下内容(特别是第二段):

现在,我知道你不能只拿一个3.5 Service Pack 1应用程序并在V4.0 CLR上运行它。 它需要一个V2.0 CLR或通过使用<compilation>标记进行重新配置以使应用程序运行在V4.0 CLR上。但是这种改变可能是您不想要的。

然而,我没有意识到的是,安装.NET 4.0不会安装您需要的2.0/3.0/3.5/3.5Sp1应用程序的部分,它只会安装V4.0 CLR和V4.0程序集, 而不会额外安装相当于.NET Framework V3.5 Sp1的东西。 因此,您需要自己安装(例如).NET Framework V3.5 Sp1以及.NET 4.0。

从我的测试结果来看,这意味着我可以在.NET 4.0上运行我的2.0 C#应用程序,使用.NET 4.0框架(4.0程序集/库),这与文章所说的相矛盾。

还是我错过了什么?如果有人能澄清这一点将非常有帮助。微软并没有真正明确说明这一点。


安装完整版本,而不是客户端配置文件。 - Hans Passant
不确定完整版本和客户端配置是否会对此产生影响? - windfly2006
1
每个人都知道这点,但是上面的片段需要用<configuration>标签包裹起来才能工作。 - mhvelplund
5个回答

10

引用如下:

“.NET Framework 4与使用.NET Framework 1.1、2.0、3.0和3.5版本构建的应用程序向后兼容。换句话说,使用以前版本的.NET Framework构建的应用程序和组件将在.NET Framework 4上运行。”

摘自.NET Framework中的版本兼容性

你对App.config文件的想法是正确的,但使用一行代码会限制你的功能。
我可以建议你更加自由地使用supportedRuntime行。

例如:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v2.0.50727"/>
    <!-- 
    <supportedRuntime version="v3.5"/>  "The .NET Framework version 3.0 and 3.5 use version 2.0.50727 of the CLR."  
    -->
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client" />
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0.1,Profile=Client" />
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0.1" />
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0.2,Profile=Client" />
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0.2" />
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0.3,Profile=Client" />
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0.3" /> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
</configuration>
为什么supportedRuntime version="v3.5"被注释掉? 请注意,这个配置标识了你的应用程序与哪些版本的公共语言运行时(CLR)兼容。CLR没有3.0或3.5版本。请参考.NET Framework版本和依赖关系

你能解释一下为什么你注释掉了v3.5这行代码吗? - Moradnejad
1
@ananda 因为这并不是必要的。我更新了我的回答来解决这个问题。 - Scott Solmer

6
根据我的测试结果,表示我可以使用.NET 4.0框架(4.0程序集/库)在.NET 4.0上运行我的2.0 C#应用程序,这与文章所说的相矛盾。您可以使用.NET 4程序集在.NET 4上运行您的应用程序。然而,由于您没有使用用于开发的相同运行时和框架,因此可能会有轻微的运行时行为变化。我认为该文章是在暗示安装4.0后你不会得到完全相同的行为,尽管正如您所见,它应该能够正常工作。如果这将作为标准部署选项,请务必对您的应用程序进行彻底的测试。

.NET 4.0不能单独安装,需要先安装旧版本(3.5 SP1/3.5)。 - Hichem
1
@K3rnel31 可以这样做-您只需配置您的应用程序以强制其使用CLR 4... - Reed Copsey
我的意思是在机器上安装.NET 4.0时,如果没有先安装3.5sp1/sp2及以上版本,它是无法单独安装的。因为.NET 4.0/4.5只是3.5sp1/sp2的更新。 - Hichem
6
@K3rnel31 这不是真的。你可以安装.NET 4而无需安装3.5sp1 - 例如,Windows 8会默认安装。.NET 4使用单独的框架/CLR,并不是一个更新 - 它是一个新的框架安装。 - Reed Copsey
@K3rnel31 Windows 8没有预装.NET 3.5。在XP或Vista上,您不必安装.NET 3.5(尽管.NET 2未预装),但是您可以从XP / Vista / Windows 7中删除3.5,并仍然安装.NET 4。我曾经在客户那里遇到过这种情况。 - Reed Copsey
@BenVoigt,聪明是一种天赋,不是从研究中复制粘贴出来的,它是创造和艺术!xD而你不是。 - Hichem

5

为了更简洁明了,您在App.config中显示支持CLR。从.Net v2开始,只有2个CLR版本。因此,以下内容将为您提供对.Net v2及以上版本的支持。确保包括与项目一起构建的exe.config文件,否则您可能仍然会看到弹出窗口要求安装.Net。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v2.0.50727"/>
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>

如果需要.NET v2到v3.5的支持,请使用以下内容:

<supportedRuntime version="v2.0.50727"/>

如果需要支持 .Net v4.0 到 4.6,请使用以下内容:

<supportedRuntime version="v4.0"/>

更多信息可以在配置应用程序以支持.NET Framework中找到。


这对我没有用。我在我的app.config中使用了这个确切的条目。我将其构建为目标设置为.NET Framework 2.0,并在仅安装了.NET Framework 4的Win10系统上运行它,它提示安装“NET Framework 3.5”。我将其构建为目标设置为.NET Framework 4.6.1,并在仅安装了.NET Framework 3.5的系统上运行它,它提示“您必须先安装以下版本的.NET Framework”,并且只列出v4.0.30319。 - AdvApp

2

来自:微软文档

.NET Framework快照

您可以选择任何App.config文件设置。


-3
仅仅将 web.config 设置为 supportedRuntime version="v4.0.30319" 是不够的。 您需要实际在 Visual Studio 中打开项目,将其目标框架 (属性->生成) 更改为 4.0,然后再将构建的解决方案重新部署到 4.0 客户端。 2.0 和 4.0 之间有几个系统组件不同 (system.web 等...) - 尽管如上一个答案所建议的那样,已提供向后兼容性。 为了持续为客户提供一个实际的“4.0 兼容”版本,唯一的办法是针对 4.0 运行时进行编译。 这将涉及升级任何第三方、开源库到其 4.0 版本。

1
首先,这不是一个网络应用程序。其次,目的是保持.NET 2.0中的程序集,并使其在所有其他版本上正常工作。 - Hichem
1
是的。明白了。以上所有内容仍然适用。您仍然需要针对4.0运行时重新编译您的应用程序(winforms应用程序或其他应用程序)。更改app.config并不能确保任何事情。假设它会在其他情况下工作是一个很大的风险 - 它可能会 - 但很多取决于使用了哪些第三方程序集(nHibernate,log4net等...)除非您将所有这些升级到其正确的(4.0)版本并针对它们重新编译,否则您将面临失败。太糟糕了,您接受了与实际经验相反的答案(它只在非常有限的情况下起作用)... - user2736158

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