Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-获取应用程序构建所依据的引用DLL的版本(而不是它在运行时引用的)_C#_.net_Dll_Build_Reference - Fatal编程技术网

C#-获取应用程序构建所依据的引用DLL的版本(而不是它在运行时引用的)

C#-获取应用程序构建所依据的引用DLL的版本(而不是它在运行时引用的),c#,.net,dll,build,reference,C#,.net,Dll,Build,Reference,我有一个应用程序,它引用了一个来自单独VS解决方案的DLL。应用程序当然是根据该DLL的特定版本构建的。但在运行时,可能存在不同(更高或更低)版本的DLL。我希望该应用程序能够向用户显示,它期望引用DLL的X版本出现 如何(在运行时)检索应用程序构建所依据的引用DLL的版本 请注意,以下解决方案给出了运行时存在的引用DLL的版本,,这不是我想要的版本: typeof(MyCompany.MyLibrary.SomeType).Assembly.GetName().Version您可以在app.c

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

如何(在运行时)检索应用程序构建所依据的引用DLL的版本

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


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

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


NET程序集包含大量信息,包括它们是根据其生成的程序集

要查看数据: 下载
CFF Explorer
,在其中拖动.net程序集,然后展开:
.NET目录-->元数据流-->#~-->表-->AssemblyRef

这是您要查找的数据:)

现在,为了自动获取这些信息,您可以深入了解所有这些信息的存储格式(这很有趣,尽管可能有点太多),或者您可以使用
Mono.cecil
,这是一个用于分析.NET模块的库

如果您想要一个示例,请看.net反汇编程序

另外,请阅读以下内容:


编辑:如果来自
BendEg
的解决方案对您有效,这比我描述的任何方法都要简单:)

对此感兴趣并验证了一些方法。在下面的代码中,主程序集引用了DummyDll.dll,它是根据该dll的1.0.0.2版构建的,但实际上加载了1.0.0.3版。然后,我尝试mono.Cecil、Assembly.getReferenceAssemblys()和相同的方法,但仅针对反射加载的程序集:

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,版本=1.0.0.2,区域性=中立,PublicKeyToken=null

DummyDll,版本=1.0.0.3,区域性=中立,PublicKeyToken=null

DummyDll,版本=1.0.0.2,区域性=中立,PublicKeyToken=null

DummyDll,版本=1.0.0.2,区域性=中立,PublicKeyToken=null


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

谢谢!我不知道Assembly.GetReferencedAssemblys()。现在我看Assembly.GetReferencedAssemblys(),它确实生成了正确的版本。我认为埃夫克的回答是可以接受的,因为它有更多的细节,尽管你确实在他面前提出了这个想法。。。很抱歉