2015-09-10 16 views
1

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

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

需要注意的是解决方案,如下面给出的参考DLL是目前在运行时,的版本,这是不是我想要的

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

回答

1

了浓厚的兴趣本和核实serveral的简单方法。在下面的代码中,主程序集引用了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,版本= 1.0.0.2,文化=中性公钥=空

DummyDll,版本= 1.0.0.3,文化=中性公钥=空

DummyDll,版本= 1.0.0.2,文化=中性公钥=空

DummyDll,版本= 1.0.0。2,Culture = neutral,PublicKeyToken = null

结果显示全部三种方法产生相同的结果,那就是你需要的结果。只有显示加载程序集的实际版本的方法是typeof(Class1).Assembly。所以最简单的方法是使用Assembly.GetReferencedAssemblies()。

+0

谢谢!我不知道Assembly.GetReferencedAssemblies()。 – Laurence

2

您可以在app.config中存储有关引用的dll的信息。但要小心,可以从任何有权访问app.config的用户更改此信息。如果我找到其他的东西,我会报告给你。

Assembly.GetReferencedAssemblies在你的情况下工作?

+0

现在我看Assembly.GetReferencedAssemblies()它确实产生正确的版本。我标记了Evk的答案,因为它有更多的细节,尽管你确实在他之前提出了这个想法......对不起! – Laurence

0

.NET程序集包含很多信息,包括它们构建的组件。

看看数据: 下载CFF Explorer,在其拖到.NET程序集,扩大: .NET Directory --> MetaData Streams --> #~ --> Tables --> AssemblyRef

有你正在寻找:)

我们获得此信息的数据自动地,您可以深入了解所有这些信息的存储格式(这非常有趣,但它可能有点太多),或者您可以使用构建用于分析.NET模块的库。

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

而且,阅读本:https://en.wikipedia.org/wiki/Metadata_(CLI)

编辑:如果从BendEg作品为您的解决方案,这是远远超过任何我所描述:)

相关问题