很多.NET程序集附带reference only version,它被剥去了实际代码,只有元数据。
例如,我可以在我的机器上的几个位置找到System.Core.dll,其中两个是:
第一个只有元数据,并在默认加载上下文中加载它会引发BadImageFormat异常。
System.BadImageFormatException:无法加载文件或程序集 ' System.Core,Version = 4.0.0.0,Culture = neutral, 公钥= b77a5c561934e089'或其中一个依赖项。的参考 不应加载程序集以执行。他们只能是 加载在仅反射加载器上下文
中
给定程序集的路径,是否可以找出它是否是"参考程序集"?
我可以检查关键字"参考装配体"的路径,但这很麻烦,如果将程序集复制到其他位置,它将无法工作。 如果有帮助,我可以自由地首先在仅反射上下文中加载程序集。
答案 0 :(得分:3)
我在CoreCLR中找到了这段代码dotnet/coreclr/.../pefile.inl,它根据我的想法if (mdImport->GetCustomAttributeByName(TokenFromRid(1, mdtAssembly),
g_ReferenceAssemblyAttribute,
NULL,
NULL) == S_OK) {
ThrowHR(COR_E_LOADING_REFERENCE_ASSEMBLY, BFA_REFERENCE_ASSEMBLY);
}
来识别参考大会:
ReferenceAssemblyAttribute
我认为完整的CLR会做同样的事情。
我还没有尝试过,但您可以将程序集加载到仅反射上下文中,然后检查它是否有{{1}}。