【问题标题】:.NET target framework compatibility and the compiler - on .NET 4.5 or higher.NET 目标框架兼容性和编译器 - .NET 4.5 或更高版本
【发布时间】:2018-07-08 06:55:11
【问题描述】:

我在 .NET 开发方面相当有经验,但今天我不得不思考一些我以前从未想过的事情:

已安装的 .NET Framework、Visual Studio 中的 .NET Framework 目标和 C# 编译器如何协同工作?

具体示例:System.dll 包含枚举 System.Net.SecurityProtocolType。在 .NET 4.5 上,此枚举包含成员 SSl3、Tls、Tls11 和 Tls12。在 .NET 4.7 中,添加了成员​​ SystemDefault。

因此,针对 .NET 4.7.x,此代码编译良好:

var p = SecurityProtocolType.SystemDefault;

但是,当我以 .NET 4.5.x 为目标时,此代码无法编译(正如人们所期望的那样)。

令我困惑的是,考虑到 .NET 4.7 是对 .NET 4.5 的就地更新(即在安装 .NET 4.7 时,.NET 4.5 的 System.dll 是替换为 .NET 4.7 之一)。

编译器如何知道我不能在 .NET 4.5 上使用 SystemDefault 但可以在 4.7 上使用它?这是通过编译器已知的某种 API 文件完成的吗?

旁白:当我以 .NET 4.5 为目标并安装了 .NET 4.7 时,对 Enum.GetValues(typeof(SecurityProtocolType) 的调用将给我 SecurityProtocolType.SystemDefault。所以我相当肯定我的 .NET 4.5 应用程序使用 .NET 4.7 System.dll。

【问题讨论】:

  • 您的机器有不同的引用程序集集,C# 编译器使用与您选择的目标匹配的集。在 c:\program files (x86)\reference 程序集目录中找到它们。目的是允许您构建一个程序,该程序可以在另一台具有旧版本 .NET 的计算机上运行。或者完全不同的框架版本,如 Silverlight、UWP 和 .NETCore 目标中使用的那样。

标签: c# .net compilation


【解决方案1】:

当您指定 .NET Framework 4.5 的目标时,您正在指定该 API 的接口表面。编译器使用这个确切的版本来确定可用的类型。

当目标计算机上存在 .NET Framework 4.7 运行时时,类型会从 4.5 转发到 4.7。但这只是运行时行为。它不会改变编译应用程序时目标是 .NET Framework 4.5 的事实。请记住,在目标机器上部署程序集时,它已经编译为中间语言。编译器在运行时完全不参与,因此无法动态更改目标框架。

至于你的侧面事实,这就是 Reflection 的 运行时行为,因为它使用的运行时框架是 4.7。

【讨论】:

  • 当构建针对 .net 4.5 并且存在 .net 4.7 时,运行时将使用 .net 4.7,您能否再解释一下?那么运行时会使用最高版本的.net框架吗?如果我错了,请纠正我,谢谢
  • 基本上,当任何版本的 .NET Framework Runtime 4.0+ 安装在机器上时,它都会replace the previous version and re-target it to use the latest version that is installed。这与大多数其他 .NET Framework 运行时安装不同,后者可以并行运行。
【解决方案2】:

编译器如何知道我不能在 .NET 4.5 上使用 SystemDefault 但可以在 4.7 上使用它?这是通过编译器已知的某种 API 文件完成的吗?

是的,我希望通过参考程序集来完成。参考程序集是一个仅包含有效的可访问 API 定义的程序集。

在我的 Windows 机器上,这些位于 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-19
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 2012-01-13
    相关资源
    最近更新 更多