[英]Enforce a specific version of a third-party assembly
我有一個依賴於一組第三方DLL版本v1.1
的應用程序。 為了使用它們,我引用了主程序,該程序位於Program Files文件夾下的某個位置。 該庫使用GAC中安裝的其他庫。
發行了新版本的第三方DLL v1.2
。 Program Files文件夾中的DLL被新版本替換; 在GAC中,兩個版本共存。
問題是在安裝v1.2
時,無需重新編譯,也無需更改app.exe.config
文件,即可使應用程序(與DLLs v1.1
一起編譯)能夠正常工作。
我是DLL的維護者; 另外的限制是,只有最新版本的DLL安裝在程序文件中,而其他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位於同一位置。 我從文檔中了解到,應該選擇GAC中的v1.1
版本,而不是v1.2
。
我的錯誤在哪里? 我該如何解決?
謝謝,
我在特定情況下找到了解決方案,然后重新閱讀了我的問題,我意識到我沒有提到我的初始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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.