2011-05-11 47 views
0

有點背景:如何管理運行時加載的dll版本?

我有一個庫項目A,其中包含大量的數據和一些託管的DLL。該項目有自己的安裝程序(由於其大小),可以獨立安裝。

然後我有一些其他項目可以提供額外的功能,當他們發現項目A也安裝。

設置: 我創建了一個Interface.dll,其中包含由項目A實現的接口。所有其他項目都包含此DLL,因此我可以在運行時加載項目A並將其轉換爲特定接口。

版本控制發生問題。有時某些項目將包含更新版本的Interface.dll,而已安裝的項目A依賴於較舊版本的項目。發生這種情況時,我的演員不再有效。

我正在考慮一些可能性:

  1. 溝interface.dll和動態加載的一切。
  2. 一些版本檢測,並告知用戶更新他的版本就A項目的
  3. 使用在interfaces.dll定義和項目實施的一個通信的一些其他手段(如命令行)
+0

爲什麼interface.dll被更新?你有沒有加入會員?改變了現有的成員?有什麼不同? – Cheeso 2011-05-11 22:19:07

+0

補充成員... – Kugel 2011-05-17 15:05:16

回答

2

想必接口沒有改變?也許其他項目剛剛添加了新界面。

您可能在這裏有一個普通的舊的.NET DLL版本問題。項目A(A.exe?)是針對interfaces.dll版本1.0.0.0編譯的,並且此信息存儲在A.exe的元數據中。當您更新interfaces.dll到1.0.0.1時,A.exe無法加載它。如果新的DLL是向後兼容的(它確實必須讓你的強制轉換工作),那麼你可以提供一個策略文件告訴運行時加載器這種兼容性。例如:

<?xml version ="1.0"?> 
<configuration> 
<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
     <assemblyIdentity name="interfaces" culture="neutral" publicKeyToken="null"/> 
     <bindingRedirect oldVersion="1.0.0.0-1.0.0.1" newVersion="1.0.0.1"/> 
    </dependentAssembly> 
    </assemblyBinding> 
</runtime> 
</configuration> 

這告訴裝載機,如果一個組件試圖加載1.0.0.0和1.0.0.1之間interfaces.dll的任何版本,則版本1.0.0.1是可接受的。在您的DLL之後使用標準模式命名該文件:policy.1.0.interfaces.xml。然後把它放在與你的A.exe相同的目錄中(我認爲)。

或者,如果你沒有更改interfaces.dll的版本號(你確實應該這樣做),那麼你可能會遇到不同的問題。如果你有兩個程序集的身份相同,但它們實際上不是相同的程序集,那麼一旦運行時加載程序加載了其中的一個程序集,它將永遠不會加載第二個程序集。有更多的細節,但因爲我認爲這不太可能是你的問題,我現在不會進入他們的問題。

+0

+1非常好的解釋 – Askolein 2013-05-29 09:19:06

相關問題