C# - 获取应用程序构建所针对的引用 DLL 的版本(不是它在运行时引用的内容)

标签 c# .net dll build reference

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

我如何检索(在运行时)应用构建所针对的引用 DLL 的版本?

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

typeof(MyCompany.MyLibrary.SomeType).Assembly.GetName().Version

最佳答案

对此感兴趣并验证了几种方法。在下面的代码中,主程序集引用了 DummyDll.dll,它是针对此 dll 的版本 1.0.0.2 构建的,但实际上加载的是版本 1.0.0.3。然后我尝试 mono.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()。

关于C# - 获取应用程序构建所针对的引用 DLL 的版本(不是它在运行时引用的内容),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32502609/

相关文章:

c# - 如何共享项目的代码文档?

.net - 从正则表达式捕获组中找到最佳匹配

c++ - 带有类和 DLL 的外部 "C"

c++ - 如何在C#中创建和使用dll文件

c++ - 测试从 qt4 迁移到 qt5 的库时出现段错误

c# - 将 MySql 不同的值传递到 c# 字符串中

c# - 如何使用户能够从 ASP.NET MVC 发送电子邮件?

c# - 缺少 System.Windows.Controls.DataVisualization.Charting 程序集引用

c# - Action<> 对象作为函数的参数并使用它

c# - 在 .NET 应用程序中播放视频