C# 使用反射从程序集获取错误版本
我试图从一个庞大的解决方案中检索每个程序集版本,但我发现当我使用dotpeek打开程序集时,它显示了真实的版本,并且我能够使用以下数字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
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
应该为您提供正确的程序集版本