【发布时间】: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.7System.dll。
【问题讨论】:
-
您的机器有不同的引用程序集集,C# 编译器使用与您选择的目标匹配的集。在 c:\program files (x86)\reference 程序集目录中找到它们。目的是允许您构建一个程序,该程序可以在另一台具有旧版本 .NET 的计算机上运行。或者完全不同的框架版本,如 Silverlight、UWP 和 .NETCore 目标中使用的那样。
标签: c# .net compilation