簡體   English   中英

.NET目標框架兼容性和編譯器 - 在.NET 4.5或更高版本上

[英].NET target framework compatibility and the compiler - on .NET 4.5 or higher

我在.NET開發方面經驗豐富,但今天我被迫圍繞以前從未想過的事情:

安裝的.NET Framework,Visual Studio中的.NET Framework目標和C#編譯器如何協同工作?

具體示例: System.dll包含枚舉System.Net.SecurityProtocolType 在.NET 4.5上,此枚舉包含成員SSl3TlsTls11Tls12 在.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

編譯器如何知道我不能在.NET 4.5上使用SystemDefault但可以在4.7上使用它? 這是通過編譯器已知的某種API文件完成的嗎?

是的,我希望它可以通過參考組件完成 引用程序集是一個有效地僅包含可訪問的API定義的程序集。

在我的Windows機器上,它們位於C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework

指定.NET Framework 4.5的目標時,您將指定該API的接口表面 編譯器使用此精確版本來確定可用的類型。

當目標計算機上存在.NET Framework 4.7運行時時,類型將從4.5轉發到4.7。 但這只是運行時行為 在編譯應用程序時,它不會改變目標是.NET Framework 4.5的事實。 請記住,當程序集部署在目標計算機上時,它已經編譯為中間語言 編譯器在運行時根本不涉及,因此無法動態更改目標框架。

至於你的事實,那就是Reflection的運行時行為 ,因為它使用的運行時框架是4.7。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM