如何识别";参考组件"
本文关键字:quot 参考 组件 何识别 识别 | 更新日期: 2023-09-27 18:01:01
很多。NET程序集附带了一个仅引用的版本,该版本去掉了实际代码,并且只有元数据。
例如,我可以找到System。Core.dll在我的机器上的几个位置,其中两个是:
- C: ''Program Files(x86(''Reference Assemblys''Microsoft''Framework。NETFramework''v4.0''System.Core.dll大小:276 KB
- C: ''Windows''Microsoft。NET''程序集'' GAC_MSIL''系统。Core''v4.0_4.0.0.0__b77a5c561934e089''SystemCore.dll大小:1291 KB
第一个只有元数据,在默认加载上下文中加载它会引发BadImageFormat异常。
系统。BadImageFormatException:无法加载文件或程序集’系统。核心,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089'或其依赖项之一引用不应加载程序集来执行。他们只能在仅反射加载程序上下文中加载
给定程序集的路径,是否可以确定它是否是"引用程序集"?
我可以检查关键字"引用程序集"的路径,但这很难,如果程序集被复制到其他位置,就不会起作用。如果有帮助的话,我可以自由地首先在仅反射的上下文中加载程序集。
我找到了这个代码dotnet/coreclr//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
。