如何识别";参考组件"

本文关键字: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