為什麼安裝了 .NET 4 的機器在使用相同 CLR 版本的情況下無法執行針對 .NET 4.5 的 exe?
在Common Language Runtime (CLR) Microsoft 頁面中,它表示 .Net Framework 4 和 4.5 都使用 CLR 版本 4。
但是,在此頁面(.NET Framework 版本和依賴項)中,它寫道“.Net Framework 4.5 版包含 CLR 4 的更新版本”
還寫道:
‘針對 .NET Framework 4.5.1 的執行檔將被阻止在僅安裝了 .NET Framework 4.5 的電腦上執行,並且將提示使用者安裝 .NET Framework 4.5.1。此外,不應從 .NET Framework 4.5 應用程序呼叫 .NET Framework 4.5.1 程序集。’
問題:如果所有 Net Framework 版本 4 和 4.5 和 4.5.1 在相同的 CLR 版本 4 上執行託管程式碼,為什麼我不能在僅安裝了 .Net 4.0 的機器上執行針對 .Net Framework 4.5 的執行檔?
(不管您的目標是 .NET 框架 4、4.5 還是 4.5.1,編譯器最終不會生成適用於 CLR 版本 4 的 IL 嗎?)
是的,CLR版本是一樣的,還是v4.0.30319。.NET Framework 類庫以一種高度向後突破的方式發生了變化。通過將 WinRT(應用商店應用)支持集成到框架中所驅動的更改。幾種類型從一個程序集移動到另一個程序集,最明顯的是 ExtensionAttribute 和 ICommand。在移動設備上實現小型 .NET 的需求非常重要。System.Core 和 PresentationFramework 都不小。
這很重要,聲明類型的程序集是.NET 類型的*類型標識的一部分。*或者換句話說,具有相同命名空間名稱和類型名稱的 .NET 類型永遠不會與來自另一個程序集的具有相同全名的類型兼容。
這完全是由於從 .NET 4.0 開始的創新。從
$$ TypeForwardedTo $$用於移動類型的屬性。以及 c:\program files\reference 程序集中的特製參考程序集。特別之處在於它們只包含元數據,並且與安裝在 GAC 中的實際程序集不直接匹配,您的程序將在執行時使用這些程序集。 由於使用錯誤的參考程序集,這有時會以非常難以診斷的方式出錯。不幸的是,微軟將傳統的參考程序集保留在 c:\windows\microsoft.net\framework 中。使用它們的項目以非常悲慘的方式失敗。
所以這根本行不通,針對 .NET 4.5 的程序將在錯誤的 4.0 GAC 程序集中查找 ExtensionAttribute 和 ICommand 等類型。並以完全無法診斷的 TypeLoadException 失敗。因此,
$$ TargetFramework $$首先檢查屬性以使盡可能早地執行程序的嘗試失敗。