使用Reflection从程序集中获取错误的版本

时间:2018-03-14 17:17:24

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

我试图从一个巨大的解决方案中检索每个程序集版本,但是我发现当我使用dotpeek打开程序集时,它显示了真实版本并且我能够bindiredirect使用这个号码:

enter image description here

但是从反思来看,使用Assembly.ImageRuntimeVersion

的数字是完全不同的
System.Security.Cryptography.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a

使用Assembly.GetName().Version

4.0.0.0

我已尝试使用下面的代码找到了我能找到的所有可能版本,但没有一个版本带有正确的数字。

Assembly assembly = Assembly.LoadFile(f);
AssemblyName thisAssemName = assembly.GetName();
Version version = thisAssemName.Version;
FileVersionInfo fileversion = FileVersionInfo.GetVersionInfo(f);

var multipleVersion = fileversion.ProductVersion
    + "|" + version
    + "|" + assembly.ImageRuntimeVersion
    + "|" + assembly;

我不知道dotpeek背后的魔力,但它有正确的事情。如何检索与工具相同的编号?

1 个答案:

答案 0 :(得分:1)

dotpeek在这里没有任何魔力。对Assembly.LoadFile(string path)方法来说,这只是一个非常混乱的名称和行为。 Assembly.LoadFile()实际上并没有在指定路径加载程序集,它更喜欢GAC,如描述here。您可以使用ProcessExplorer或类似工具检查加载的装配的实际路径。

如果要在精确路径上加载程序集以进行反射,最好使用Assembly.ReflectionOnlyLoadFrom()方法:

Assembly assembly = Assembly.ReflectionOnlyLoadFrom(f);

在这种情况下,assembly.GetName().Version应该会为您提供正确的程序集版本。