我在.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的dll,为什么这会起作用呢?编译器是通过某种API文件来知道我不能在.NET 4.5上使用SystemDefault,但可以在4.7上使用吗?
附带事实:当我针对.NET 4.5并安装了.NET 4.7时,调用Enum.GetValues(typeof(SecurityProtocolType)将给我SecurityProtocolType.SystemDefault。所以,我非常确定我的.NET 4.5应用程序使用的是.NET 4.7 System.dll。