使用反射从程序集获取错误版本

Getting wrong Version from Assembly using Reflection

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

但是从反射来看,使用 Assembly.ImageRuntimeVersion 的数字完全不同:

System.Security.Cryptography.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a

使用Assembly.GetName().Version:

4.0.0.0

我已经使用下面的代码尝试了我能找到的所有可能的版本,但是其中 none 个带来了正确的数字。

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 背后的魔力,但它有正确的东西。如何找回与工具相同的号码?

dotpeek 在这里没有任何魔力。对于 Assembly.LoadFile(string path) 方法,这只是一个 very-very 令人困惑的名称和行为。 Assembly.LoadFile() 实际上不会在指定路径加载程序集,它更喜欢描述的 GAC here. You could check the actual path of loaded assembly with ProcessExplorer 或类似工具。

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

Assembly assembly = Assembly.ReflectionOnlyLoadFrom(f);

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