代码之家  ›  专栏  ›  技术社区  ›  Fals

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

  •  1
  • Fals  · 技术社区  · 6 年前

    我试图从一个巨大的解决方案中检索每个程序集版本,但我发现,当我使用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 回复  |  直到 6 年前
        1
  •  1
  •   CodeFuller    6 年前

    dotpeek在这里没有任何魔力。这只是一个非常令人困惑的名字和行为 Assembly.LoadFile(string path) 方法 Assembly.LoadFile() 不会在指定的路径上实际加载程序集,它更希望使用如下所述的GAC here 。可以使用检查加载程序集的实际路径 ProcessExplorer 或类似工具。

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

    Assembly assembly = Assembly.ReflectionOnlyLoadFrom(f);
    

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