2016-09-14 65 views
0

我有一個應用程序依賴於一組第三方DLL,版本號v1.1。爲了使用它們,我引用了主程序,它位於Program Files文件夾下的某處。該庫使用安裝在GAC中的其他庫。強制執行特定版本的第三方程序集

發佈新版本的第三方DLL,v1.2。 Program Files文件夾中的DLL被新版本替換;在GAC中,兩個版本並存。

的問題是獲取應用程序(與DLL文件v1.1編譯)當安裝v1.2,無需重新編譯它,並在不改變app.exe.config文件的工作。

我是DLL的維護者;其他限制是只有最新版本的DLL安裝在Program Files中,而其他DLL全部安裝在GAC中(所有版本都保留)。

我的問題是,應用程序啓動,但最終我得到的,因爲類型之間不兼容的錯誤:

Unhandled Exception: System.InvalidCastException: 
[A]ThirdParty.User cannot be cast to [B]ThirdParty.User. 
Type A originates from 'ThirdParty, Version=1.2.0.0, Culture=neutral, PublicKeyToken=XXXX' 
in the context 'Default' at location 'C:\Windows\Microsoft.Net\assembly\GAC_32\ThirdParty\v4.0_1.2.0.0__XXXX\ThirdParty.dll'. 
Type B originates from 'ThirdParty, Version=1.1.0.0, Culture=neutral, PublicKeyToken=XXXX' 
in the context 'Default' at location 'C:\Windows\Microsoft.Net\assembly\GAC_32\ThirdPart\v4.0_1.1.0.0__XXXX\ThirdParty.dll'. 

我不知道理解v1.2 DLL是如何選擇的,我猜測路徑到DLL存儲在應用程序中,而該應用程序又決定在此版本的GAC中使用DLL?我正在測試與用於編譯的系統不同的系統,但這些DLL位於相同的位置。我對documentation的理解是,應該選擇GAC中的v1.1版本,而不是v1.2

我的錯誤在哪裏?我該如何解決它?

感謝,

+0

非常標準的DLL地獄。 *以某種方式* v1.2對象被創建,即使你不瞄準它。找到邪惡者的一個簡單方法是讓v1.2無法訪問,將其從GAC中移除。現在它應該彈起,因爲它無法再找到DLL。但很可能你必須向作者發送一個錯誤報告。 –

+0

@HansPassant我是這個地獄的維護者...... – piwi

回答

0

我發現在我的特定情況下的解決方案,並重新閱讀我的問題,我知道我沒有提到我的初步DLL不依靠PowerShell實例。這是我解決我的問題的地方。在我的DLL,我加載如果是存在於GAC DLL中的特定版本,並在我的PowerShell例如加載:

var assembly = Assembly.Load("ThirdParty, Version=1.1.0.0, Culture=neutral, PublicKeyToken=XXXX"); 
var ps = PowerShell.Create(); 
ps.Commands.AddCommand("Import-Module").AddParameter("-Assembly", assembly); 
ps.Invoke();