AssemblyVersionAttribute

AssemblyVersionAttribute

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

为什么也没有该属性?

正如ILSpy演示的那样,Mono Cecil可以阅读所有内容。但是对于我的特定工具而言,该库太大了。

最佳答案

因为编译器和运行时都说谎。 Just like The Doctor

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

现在,对于常规反射模型,运行时可以对其进行欺骗-通过将值从其实际位置拉出并假装,使其看起来像实际上已将其作为属性元数据添加了。对于仅反射模型不执行此操作。

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

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

10-07 16:10