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

C# 使用反射从程序集获取错误版本,c#,.net,reflection,.net-assembly,C#,.net,Reflection,.net Assembly,我试图从一个庞大的解决方案中检索每个程序集版本,但我发现当我使用dotpeek打开程序集时,它显示了真实的版本,并且我能够使用以下数字bindirect: 但是使用Assembly.ImageRuntimeVersion时,从反射角度看,数字完全不同: System.Security.Cryptography.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 使用Assembly.Get

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

但是使用
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背后的魔力,但它有正确的东西。如何检索与工具相同的编号?

dotpeek在这里没有任何魔力。对于
Assembly.LoadFile(字符串路径)
方法,它只是一个非常容易混淆的名称和行为
Assembly.LoadFile()
实际上并没有在指定的路径加载程序集,它更喜欢前面描述的GAC。您可以使用或类似工具检查加载部件的实际路径

如果您希望以精确路径加载程序集以进行反射,最好使用
assembly.reflectiononnlyloadfrom()
方法:

Assembly assembly = Assembly.ReflectionOnlyLoadFrom(f);
在这种情况下,
assembly.GetName().Version
应该为您提供正确的程序集版本