![](/img/trans.png)
[英]AccessViolationException in .NET framework 4.5 or higher
[英].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上,此枚舉包含成員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
。
編譯器如何知道我不能在.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.