您可以加载程序集并查询所有程序集属性,包括AssemblyInformationalVersionAttribute
,AssemblyVersionAttribute
和AssemblyFileVersionAttribute
。但是,仅在使用Assembly.ReflectionOnlyLoadFrom
方法打开装配体进行反射时,仅列出信息版本和文件版本,而不是AssemblyVersionAttribute
。
为什么我也不能获得该属性?
正如ILSpy演示的那样,Mono Cecil可以全部阅读它们。但是这个库对于我的特定工具来说太笨重了。答案 0 :(得分:6)
因为编译器和运行时都在。 Just like The Doctor
有些属性不实际上以自然形式嵌入。 AssemblyVersionAttribute
就是其中之一。另一个是SerializableAttribute
。他们不被添加为.custom instance
条目,但通过其他信息表示。
现在,对于常规反射模型,运行时可以欺骗它 - 使它看起来像实际上已经将它们作为属性元数据添加 - 通过将值拉出实际的位置去,假装。对于仅反射模型,它不会这样做。
您只需要通过装配实例检查装配版本。在IL术语中,这是.ver
条目中的.assembly
。但assembly.GetName().Version
可能是在运行时读取它的最简单方法。
您可以通过查看反射器,ildasm或任何其他工具中的原始装配来验证这一点。