在C:\ Program Files(x86)\ Reference Assemblies中找到的程序集是引用程序集。它們在.NET 4.0及更高版本中相當特殊,它們不包含任何代碼,只是類型聲明。編譯器僅使用這種程序集中的元數據來編譯代碼。在運行時,您會得到一個非常不同的程序集,它是從GAC中檢索的。
請注意,你會發現System.Runtime.dll的許多拷貝在該目錄中,尤其是.NETPortable目錄有許多各有自己是參考組裝的副本型材。使用不同的類型集合,適合特定配置文件的類型。
您在C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319中找到的程序集是GAC中的程序集的副本。無論您實際安裝的是哪種版本的框架。你應該從來沒有使用這些程序集的任何東西。儘管許多程序集仍然有一個[AssemblyVersion(「4.0.0.0」)],它們的內容大不相同,特別是在4.0和4.5之間。你可以在文檔中看到這個,ExtensionAttribute class就是一個很好的例子。在.NET 4.0中它存在於4.5中的System.Core.dll中,現在它存在於mscorlib.dll中。如果這些副本不在身邊會更好,不幸的是System.CodeDom,sgen.exe和傳統工具取決於他們在那裏。當程序在安裝了不同框架版本的另一臺機器上運行時,將它們用作參考可以使用be very troublesome。
所以看看GAC中的程序集,知道究竟是什麼在運行時發生。自.NET 4.0以來,它發生了很大的變化,它現在存在於另一個目錄中。以前在c:\ windows \ assembly中,現在在c:\ windows \ microsoft.net \ assembly中。而最明顯的變化是,它不再有外殼擴展,它阻止了你導航到該目錄中的文件。您可以直接導航GAC文件夾結構。由於包含非託管代碼的程序集(如mscorlib.dll)存儲在一個單獨的目錄中,因此這有點複雜。有一個看看,你會很難找出計劃。
你會發現那裏的C:\ Windows \ Microsoft.NET \程序集\ GAC_MSIL \ System.Runtime \ v4.0_4.0.0.0__b03f5f7f11d50a3a \ System.Runtime.dll程序集確實是空的。然而你可能錯過了清單中最重要的細節。它包含[TypeForwardedTo]屬性的lot。你會發現那裏的人的喀嚓:
[assembly: TypeForwardedTo(typeof(Action))]
[assembly: TypeForwardedTo(typeof(Action<>))]
[assembly: TypeForwardedTo(typeof(Action<,,,,,,,,,>))]
[assembly: TypeForwardedTo(typeof(Action<,,,,,,,,,,>))]
[assembly: TypeForwardedTo(typeof(Action<,,,,,,,,,,,>))]
[assembly: TypeForwardedTo(typeof(Action<,,,,,,,,,,,,>))]
[assembly: TypeForwardedTo(typeof(Action<,,,,,,,,,,,,,>))]
[assembly: TypeForwardedTo(typeof(Action<,,,,,,,,,,,,,,>))]
[assembly: TypeForwardedTo(typeof(Action<,,,,,,,,,,,,,,,>))]
// etc, many more
也許你可以看看現在發生了什麼事情,System.Runtime.dll不包含任何代碼。它是一個適配器,將類型從一個程序集轉發到另一個程序集。 .NET的桌面版本將類型轉發到mscorlib.dll,System.dll,System.ComponentModel.Composition和System.Core。
上一句中的「桌面版」是解釋爲什麼這樣做的關鍵。有許多許多 .NET Framework版本,它們在System.Runtime中具有不同的轉發器。這些適配器組件向Microsoft購買額外的間接級別。它可以幫助您編寫與平臺無關的.NET代碼,並且無論您是在臺式機上,Store應用程序,Silverlight瀏覽器,XBox遊戲機上,手機上執行它,它們的運行都不會發生變化。即使後者有一個相當不同的框架,一個更小的名爲.NETCore。可移植類庫項目模板是主要的受益者。
哇!我猜Xamarin也會利用這種語言投影嗎?非常感謝您發佈冗長的答案。是否有任何官方文檔可以讓我更多地瞭解這些變化? –
這沒有記錄在任何我知道的地方。像這樣的東西通常最終會在博客中得到半記錄,但David Kean和Mircea Trofin都不是認真的博主。我從研究參考集反向設計了這個,花了我一段時間。 SO是缺少的手冊。 –
因此,指向特定Profile123子集的「.NET Portable Subset」引用的PCL反過來將Profile123中的類型轉發到目標設備上的特定庫和版本? –