我有一个应用程序依赖于一组第三方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