我有一個應用程序依賴於一組第三方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
。
我的錯誤在哪裏?我該如何解決它?
感謝,
非常標準的DLL地獄。 *以某種方式* v1.2對象被創建,即使你不瞄準它。找到邪惡者的一個簡單方法是讓v1.2無法訪問,將其從GAC中移除。現在它應該彈起,因爲它無法再找到DLL。但很可能你必須向作者發送一個錯誤報告。 –
@HansPassant我是這個地獄的維護者...... – piwi