Assembly.GetCustomAttributesData找不到AssemblyVersionAttribute

时间:2014-05-29 11:33:17

标签: .net reflection attributes .net-assembly

您可以加载程序集并查询所有程序集属性,包括AssemblyInformationalVersionAttributeAssemblyVersionAttributeAssemblyFileVersionAttribute。但是,仅在使用Assembly.ReflectionOnlyLoadFrom方法打开装配体进行反射时,仅列出信息版本和文件版本,而不是AssemblyVersionAttribute

为什么我也不能获得该属性?

正如ILSpy演示的那样,Mono Cecil可以全部阅读它们。但是这个库对于我的特定工具来说太笨重了。

1 个答案:

答案 0 :(得分:6)

因为编译器和运行时都在Just like The Doctor

有些属性实际上以自然形式嵌入。 AssemblyVersionAttribute就是其中之一。另一个是SerializableAttribute。他们被添加为.custom instance条目,但通过其他信息表示。

现在,对于常规反射模型,运行时可以欺骗它 - 使它看起来像实际上已经将它们作为属性元数据添加 - 通过将值拉出实际的位置去,假装。对于仅反射模型,它不会这样做。

您只需要通过装配实例检查装配版本。在IL术语中,这是.ver条目中的.assembly。但assembly.GetName().Version可能是在运行时读取它的最简单方法。

您可以通过查看反射器,ildasm或任何其他工具中的原始装配来验证这一点。