2015-09-10 18 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作品爲您的解決方案,這是遠遠超過任何我所描述:)

相關問題