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