如何识别"参考组件"?

时间:2016-08-05 23:42:10

标签: c# .net dll .net-assembly

很多.NET程序集附带reference only version,它被剥去了实际代码,只有元数据。

例如,我可以在我的机器上的几个位置找到System.Core.dll,其中两个是:

  • C:\ Program Files(x86)\ Reference Assemblies \ 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,Version = 4.0.0.0,Culture = neutral,   公钥= b77a5c561934e089'或其中一个依赖项。的参考   不应加载程序集以执行。他们只能是   加载在仅反射加载器上下文

给定程序集的路径,是否可以找出它是否是"参考程序集"?

我可以检查关键字"参考装配体"的路径,但这很麻烦,如果将程序集复制到其他位置,它将无法工作。 如果有帮助,我可以自由地首先在仅反射上下文中加载程序集。

1 个答案:

答案 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}}。