65.9K
CodeProject 正在变化。 阅读更多。
Home

.NET 版本管理与 C# 应用程序和组件的多目标定位

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (19投票s)

2015年6月28日

CPOL

8分钟阅读

viewsIcon

61404

本文讨论了使用 C# 编写的 .NET 应用程序和组件的 .NET 版本管理和多目标定位。

引言

本文旨在分享我对 .NET Framework 版本管理和多目标定位的研究。基于我的研究,我提出了一些关于如何构建 C# 应用程序或组件以定位不同版本的 .NET Framework,从而部署到最终用户计算机上的指南。因此,这些指南将帮助我们获得愉快顺畅的客户体验。我考虑的是用 C# 编写的 Windows 应用程序和 Windows 窗体用户控件。

警告:我的文章篇幅很长且有些枯燥,但如果您耐心阅读,您会从中受益。

本文将回答一个问题:我们应该为应用程序定位哪个版本的 .NET CLR 运行时?

背景

自 2002 年以来,微软已经发布了 .NET Framework 1.0、1.1、2.0、3.0、3.5、4.0 和 4.5。直到今天,我的电脑上已经安装了 .NET Framework 4.5.2。在下一个版本 .NET Framework 4.6 中,它将取代 4.0、4.5、4.5.1、4.5.2。同时,Visual Studio IDE 也经历了 Visual .Studio .NET、2003、2005、2008、2010、2012、2013 版本。下一个版本将是 Visual Studio 2015。从 Visual Studio 2010 开始,我们可以编译定位不同 .NET Framework 的应用程序。

对于 Windows 版本,XP 已过时,我们目前有 Vista、7、8、8.1。

随之而来的问题是:基于如此多的不同版本的 .NET Framework 和操作系统版本,我们如何定位我们的应用程序或用户控件,使其在客户的计算机上顺利运行?

从参考文献 [1] 和 [2] 中,我们可以看到用户在 .NET Framework 4.5 就地替换 4.0 时遇到的挑战和困惑。这两篇参考文献对于澄清这些困惑非常有帮助。

.NET Framework 状态

请参阅下表,了解 .NET Framework 和底层 .NET CLR 运行时版本。

我们可以看到,.NET 3.0 和 3.5 是 .NET 2.0 的就地升级,因为 CLR 是相同的 2.0。

对于 .NET 4.5,它是 .NET 4.0 的就地升级,但实际上底层的 .NET CLR 也已更新,但仍然标记为 4.0.30319 版本,但其内部版本号是 17379,而不是 269。请参阅参考文献 [2] 以获得详细调查。

.NET 4.0, 4.5 (4.5.1 & 4.5.2) | .NET 4.0 CLR。

.NET Framework 版本和依赖项

目前市场上,我们有 Vista、7、8.0 和 8.1 等 Windows 版本。它们自带的 .NET Framework 版本是什么情况?这一事实将帮助我们决定我们的应用程序应定位哪个 CLR 运行时。

从参考文献 [3] 中,我们可以看到操作系统版本和 CLR 运行时版本之间的关系。下图是从该文章中复制的。

从这篇文章中,我们可以看到 Windows Vista 发布时附带 .NET Framework 3.0,之后很快更新到 .NET 3.5。用户可以一直更新到 .NET Framework 4.5.2。

Windows 7、8.0 和 8.1 发布时附带 .NET Framework 3.5。用户可以一直更新到 .NET Framework 4.5.2。

使用 supportedRuntime 元素的示例

在参考文献 [1] 中,有一个示例展示了如何使用 supportedRuntime 元素。例如,如果我们构建的应用程序定位 .NET Framework 4.5,但我们不知道用户计算机是否安装了该版本,那么我们可以使用配置文件来提示用户安装,如果 .NET Framework 4.5 未安装。这样用户就能得到一个明确的指示,知道该怎么做,而不是看到您的应用程序神秘地崩溃。将此应用程序配置文件放在与可执行文件相同的目录中,并将其命名为 app.config

<!--?xml version="1.0" encoding="utf-8" ?-->
<configuration>
    <startup> 
        <supportedruntime sku=".NETFramework,Version=v4.5" version="v4.0">
    </supportedruntime></startup>
</configuration>

supportedRuntime 元素在参考文献 [8] 中有详细介绍。从这篇文章 [8] 中,我们可以看到 supportedRuntime 元素可以多次使用。

<configuration>
   <startup>
      <supportedruntime version="v1.1.4322">
      <supportedruntime version="v1.0.3705">
   </supportedruntime></supportedruntime></startup>
</configuration>

supportedRuntime 元素中的 SKU 属性与应用程序构建目标配置文件

在 [8] 中,我们可以看到 SKU 属性与应用程序目标框架之间的关系。应用程序目标框架在 Visual Studio 2013 (任何版本都一样) 的项目属性页 => 应用程序选项卡中设置。

SKU 属性与应用程序目标框架版本

请注意标题下方第一行。

<configuration>
   <startup>
      <supportedruntime sku=".NETFramework,Version=v4.0,Profile=Client">
   </supportedruntime></startup>
</configuration> 

如果我们构建的应用程序目标框架为 4.0 或 4.5,无论是完整版还是客户端配置文件,我们都可以按上述方式设置 supportedRuntime。它将适用于所有这些目标框架。

应用程序运行时 .NET Framework 版本顺序的确定方法

当用 C# 编写的应用程序开始运行时,它需要启动或激活 CLR 以运行托管代码。通常,.NET Framework 应用程序会在其构建时所在的 CLR 版本上运行,但您可以通过使用应用程序配置文件来更改此行为。

应用程序运行的 .NET Framework 版本按以下顺序确定 [6]:

  1. 配置文件

    如果应用程序配置文件包含指定一个或多个 .NET Framework 版本的条目,并且其中一个版本存在于用户计算机上,则应用程序在该版本上运行。配置文件按照列出的顺序读取条目,并使用用户计算机上存在的第一个列出的 .NET Framework 版本。(对于版本 1.0,请使用元素。)

  2. 编译版本

    如果没有配置文件,但应用程序构建时所在的 .NET Framework 版本存在于用户计算机上,则应用程序在该版本上运行。

  3. 已安装的最新版本

    如果应用程序构建时所在的 .NET Framework 版本不存在,并且配置文件没有在元素中指定版本,则应用程序尝试在用户计算机上已安装的最新版本的 .NET Framework 上运行。

如果我们的应用程序同时支持 .NET Framework 3.5 和 4 或更高版本,我们可以使用配置文件中的多个 supportedRuntime 元素条目来避免 .NET Framework 初始化错误。有关更多信息,请参阅 [3]。

我们还可以将 .NET Framework 3.5 应用程序配置为在 .NET Framework 4 或 4.5 上运行,即使在已安装 .NET Framework 3.5 的计算机上也是如此,以利用 4 和 4.5 版本中的性能改进。

再次强调,请注意 1) 配置文件中如何使用多个 supportedRuntime 条目。因此,我们可以利用不同顺序的多个 supportedRuntime 元素来满足我们的需求。请参阅我从 [6] 截取的以下表格。

应用程序配置文件设置表

请特别注意表头下方的第 4 行。这里使用了 supportedRuntime 元素的多个条目。此设置适用于安装了 .NET Framework 3.5 或 .NET Framework 4.0 或 .NET Framework 4.5 中任何一个的计算机。因此,我们可以设置 supportedRuntime 元素如下:

<configuration>
   <startup>
      <supportedruntime version="v4.0"> 
      <supportedruntime version="v2.0.50727"> 
   </supportedruntime></supportedruntime></startup>
</configuration>  

使用 C# 构建应用程序的指南

基于以上发现,我们可以为构建应用程序提供这些指南。我们的构建可以是 32 位,因为 32 位应用程序可以在 64 位机器上运行。

  1. 定位所有 Windows 版本:Vista、7、8.0、8.1。

    我们可以将应用程序构建为定位 .NET Framework 3.5,但要在应用程序配置文件中添加以下 supportedRuntime 元素:

    <configuration>
       <startup>
          <supportedruntime version="v4.0"> 
          <supportedruntime version="v2.0.50727"> 
       </supportedruntime></supportedruntime></startup>
    </configuration>  
  2. 定位 .NET Framework 4.0 上的应用程序。

    我们可以将应用程序构建为定位 .NET Framework 4.0,并向应用程序配置文件中添加以下 supportedRuntime 元素:

    <configuration>
       <startup>
          <supportedruntime sku=".NETFramework,
          Version=v4.0,Profile=Client" version="v4.0">
       </supportedruntime></startup>
    </configuration>  
  3. 更进一步,直接定位 .NET Framework 4.5

    我们可以直接将应用程序构建为定位 .NET Framework 4.5,并在应用程序配置文件中添加以下 supportedRuntime

    <configuration>
        <startup> 
            <supportedruntime sku=".NETFramework,Version=v4.5" version="v4.0">
        </supportedruntime></startup>
    </configuration>

    在这种情况下,如果用户计算机未安装 .NET Framework 4.5,它将以一种友好的方式提示用户安装,而不是默默崩溃。

最新更新

根据博文 [9],.NET Framework 4.0、4.5 和 4.5.1 已停止支持。请注意,根据较新 Framework 的支持策略,将这些 Framework 作为目标并在较新 .NET Framework 版本上运行时,仍将继续受到支持。

因此,开发人员将面临兼容性问题。从 .NET Framework 4.5.1 开始,兼容性问题被分为“运行时更改”或“重新定位更改”。更多详情请参阅 [9]。

结论

经过长时间的讨论和证据,我们获得了以上指南,以便使用 C# 构建正确版本的应用程序和用户控件。

如果我遗漏了任何内容或在任何地方犯了错误,请告知我。您的反馈意见受到欢迎。我很高兴看到更多成员从本文中受益。

参考文献

  1. .NET 版本管理和多目标定位 - .NET 4.5 是 .NET 4.0 的就地升级
    http://www.hanselman.com/blog/NETVersioningAndMultiTargetingNET45IsAnInplaceUpgradeToNET40.aspx
  2. https://weblog.west-wind.com/posts/2012/Mar/13/NET-45-is-an-inplace-replacement-for-NET-40
    https://weblog.west-wind.com/posts/2012/Mar/13/NET-45-is-an-inplace-replacement-for-NET-40
  3. .NET Framework 版本和依赖项
    https://msdn.microsoft.com/zh-cn/library/bb822049(v=vs.110).aspx
  4. 应用程序在 .NET Framework 中的兼容性
    https://msdn.microsoft.com/zh-cn/library/dn458358(v=vs.110).aspx
  5. .NET Framework 中的版本兼容性
    https://msdn.microsoft.com/zh-cn/library/ff602939(v=vs.110).aspx
  6. 如何:配置应用程序以支持 .NET Framework 4 或 4.5
    https://msdn.microsoft.com/zh-cn/library/jj152935(v=vs.110).aspx
  7. ComponentGuaranteesAttribute 类
    https://msdn.microsoft.com/zh-cn/library/system.runtime.versioning.componentguaranteesattribute(v=vs.110).aspx
  8. supportedRuntime 元素
    https://msdn.microsoft.com/zh-cn/library/w4atty68(v=vs.110).aspx
  9. .NET Framework 兼容性简介

历史

  • 2015年3月13日:初始化本文
  • 2015年6月27日:添加了更多内容
© . All rights reserved.