簡體   English   中英

如何識別“參考程序集”?

[英]How to identify a “reference assembly”?

許多.NET程序集附帶了僅供參考的版本 ,該版本去除了實際代碼,並且僅包含元數據。

例如,我可以在計算機上的幾個位置找到System.Core.dll,其中兩個是:

  • C:\\ Program Files(x86)\\ Reference Assemblys \\ Microsoft \\ Framework.NETFramework \\ v4.0 \\ System.Core.dll 大小:276 KB
  • C:\\ Windows \\ Microsoft.NET \\ assembly \\ GAC_MSIL \\ System.Core \\ v4.0_4.0.0.0__b77a5c561934e089 \\ System.Core.dll 大小:1291 KB

第一個只有元數據,並且在默認加載上下文中加載它會引發BadImageFormat異常。

System.BadImageFormatException:無法加載文件或程序集'System.Core,版本= 4.0.0.0,區域性=中性,PublicKeyToken = b77a5c561934e089'或其依賴項之一。 參考程序集不應加載以執行 它們只能在僅反射的加載器上下文中加載

給定裝配的路徑,是否有可能找出它是否是“參考裝配”?

我可以檢查關鍵字“ Reference Assemblies”的路徑,但這很hacky,如果將程序集復制到其他位置,則無法使用。 如果有幫助,我可以自由地在僅反射的上下文中加載程序集。

我在CoreCLR中找到了這段代碼dotnet / coreclr /.../ pefile.inl ,該代碼通過我認為是System.Runtime.CompilerServices.ReferenceAssemblyAttribute標識了一個參考程序集:

if (mdImport->GetCustomAttributeByName(TokenFromRid(1, mdtAssembly),
                                       g_ReferenceAssemblyAttribute,
                                       NULL,
                                       NULL) == S_OK) {
    ThrowHR(COR_E_LOADING_REFERENCE_ASSEMBLY, BFA_REFERENCE_ASSEMBLY);
}

我認為完整的CLR也是一樣。

我還沒有嘗試過,但是您可以將程序集加載到僅反射的上下文中,然后檢查它是否具有ReferenceAssemblyAttribute

暫無
暫無

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

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