获取应用构建时引用的DLL的版本(而不是在运行时引用的版本)

本文关键字:引用 版本 运行时 构建 应用 DLL 获取 | 更新日期: 2023-09-27 18:12:12

我有一个引用DLL的应用程序,它来自一个单独的VS解决方案。当然,应用程序是根据该DLL的特定版本构建的。然而,在运行时,可能存在不同版本的DLL(更高或更低)。我希望应用程序能够显示给用户,它期望参考DLL的X版本存在。

我如何检索(在运行时)引用的DLL的版本,该应用程序是针对?

请注意,下面的解决方案给出了运行时存在的引用DLL的版本,这不是我想要的:

typeof (MyCompany.MyLibrary.SomeType) .Assembly.GetName()。版本

获取应用构建时引用的DLL的版本(而不是在运行时引用的版本)

对此感兴趣并验证了几个方法。在下面的代码中,主程序集引用DummyDll.dll,并且它是根据该dll的1.0.0.2版本构建的,但实际上加载的是1.0.0.3版本。然后我尝试单核细胞增多症。Cecil, assembly . getreferencedassemblies()和相同的,但仅用于反射加载的程序集:

internal class Program {
    private static void Main(string[] args) {
        new Class1().Test(); // otherwise DummyDll will not be referenced.
        var asm = Mono.Cecil.AssemblyDefinition.ReadAssembly(Assembly.GetEntryAssembly().Location);
        foreach (var reference in asm.MainModule.AssemblyReferences) {
            if (reference.FullName.Contains("DummyDll"))
                Console.WriteLine(reference.FullName);
        }
        Console.WriteLine();
        Console.WriteLine(typeof(Class1).Assembly.FullName);
        Console.WriteLine();
        foreach (var referenced in Assembly.GetEntryAssembly().GetReferencedAssemblies()) {
            if (referenced.FullName.Contains("DummyDll"))
            Console.WriteLine(referenced.FullName);
        }
        Console.WriteLine();
        var asm2 = Assembly.ReflectionOnlyLoad(Assembly.GetEntryAssembly().FullName);            
        foreach (var referenced in asm2.GetReferencedAssemblies()) {
            if (referenced.FullName.Contains("DummyDll"))
                Console.WriteLine(referenced.FullName);
        }            
        Console.ReadKey();
    }
}

结果如下:

DummyDll, Version=1.0.0.2, Culture=neutral, PublicKeyToken=null

DummyDll, Version=1.0.0.3, Culture=neutral, PublicKeyToken=null

DummyDll, Version=1.0.0.2, Culture=neutral, PublicKeyToken=null

DummyDll, Version=1.0.0.2, Culture=neutral, PublicKeyToken=null

结果表明所有三种方法产生相同的结果,这就是您需要的结果。唯一能显示装载的组件的真实版本的方法是typeof(Class1). assembly。因此,获得所需内容的最简单方法是使用Assembly.GetReferencedAssemblies()。

可以在app.config中存储有关引用dll的信息。但是要小心,任何访问app.config的用户都可以更改此信息。如果我发现其他问题,我会向你报告的。

是组装。getrereferencedassemblies在你的情况下工作吗?

。. NET程序集包含大量信息,包括它们赖以构建的程序集。

查看数据:下载CFF Explorer,在其中拖拽一个。net程序集,展开:.NET Directory --> MetaData Streams --> #~ --> Tables --> AssemblyRef

有你要找的数据:)

现在要自动获取这些信息,您可以深入研究所有这些信息的存储格式(它非常有趣,尽管它可能有点太多了),或者您可以使用Mono.cecil,一个用于分析。net模块的库。

如果你想要一个例子,看看ILSpy,一个。net反汇编器。

还有,读这个:https://en.wikipedia.org/wiki/Metadata_(CLI)

编辑:如果BendEg的解决方案适用于您,那比我描述的任何解决方案都要简单得多:)