2012-07-10 52 views
12

爲.NET Compact Framework引入了可重定向彙編引用,現在用於支持可移植類庫。C#編譯器如何決定發出可重定向的程序集引用?

基本上,編譯器生成以下MSIL:

.assembly extern retargetable mscorlib 
{ 
    .publickeytoken = (7C EC 85 D7 BE A7 79 8E)       
    .ver 2:0:5:0 
} 

如何C#編譯器瞭解它必須發出一個重定目標的引用,以及如何強制C#編譯器外連的便攜式的發射這樣的參考類庫?

+0

MSBuild目標文件沒有提示?我想知道你需要從命令行傳遞給編譯器。 – leppie 2012-07-10 07:49:05

回答

2

對於程序集本身,它是一個程序集標誌,即[assembly:AssemblyFlags(AssemblyNameFlags.Retargetable)]。

請注意,此標誌在平臺組件外是沒有意義的 - 自定義程序集不能重定向。

對於引用,它被複製爲被引用程序集名稱的一部分。

+0

謝謝。這是我正在尋找的。我希望擺脫消息'無法加載文件或程序集'PostSharp,版本= 3.0.0.0,文化=中立,PublicKeyToken = 53d2effcf2ee70dc,Retargetable =是'或其依賴項之一。定位的程序集清單定義與程序集引用不匹配。(來自HRESULT的異常:0x80131040)'提供(通過IHostAssemblyStore)另一個程序集而不是CLR請求的程序集,但即使使用可重定目標引用,仍然會出現錯誤。有沒有解決這個問題的方法? – 2012-07-11 05:55:00

+0

可重定向不會讓你鍵跳用戶程序集,就像我假設你正在嘗試。這完全是CLR內部的目的。我不是託管API的專家,但我認爲LoadFile可能允許您這樣做。 – 2012-07-11 08:15:11

+0

謝謝。我會嘗試另一種解決方案:相同的短名稱,相同的強名鍵,但不同的版本號。正常的綁定策略應該可以做到。 – 2012-07-11 12:07:33

2

不確定這是否會有所幫助,但以下文件是自動生成的幷包含在構建中。

using System; 
using System.Reflection; 
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(
    ".NETPortable,Version=v4.0,Profile=Profile4", 
    FrameworkDisplayName = ".NET Portable Subset")] 

這可能暗示編譯器做一些魔術。

編輯:

我認爲上面的圖書館是可移植的。從命令行我可以看到使用了/nostdlib+,並引用了便攜式mscorlib.dll(我假設它具有與上述相同的屬性)。

「... \ Program Files文件\參考大會\微軟\ Framework.NETPortable \ V4.0 \資料\ Profile4 \ mscorlib.dll中」

+1

'TargetFrameworkAttribute'也存在於v4版本的Client和Full Framework版本中,它不適用於v3.5版本。這可能是他們添加屬性的原因。從第4版開始,它還提供了一種非常簡單的方法來確定程序集是爲完整框架還是客戶端配置文件構建的。 – 2012-07-10 08:05:51

+0

@AdamHouldsworth:謝謝,我想現在已經過時了,因爲客戶端配置文件已經在4.5了? ; p – leppie 2012-07-10 08:07:53

+0

即使在.NET 4中,客戶端配置文件和完全下載之間的區別也是幾MB,不值得 - 可能爲什麼他們將它改爲PCL。 – 2012-07-10 08:08:44

0

我已經通過實驗,在C#編譯器會做出注意到如果引用程序集標記爲可重定向(MSIL中.assembly部分的修飾符),則可將參考編譯器設置爲可重定向。我沒有找到編譯器決定如何使程序集可重定向。

相關問題