【发布时间】:2016-09-14 12:04:23
【问题描述】:
我有一个依赖于一组第三方 DLL 的应用程序,版本为 v1.1。为了使用它们,我参考了主要的,它位于 Program Files 文件夹下的某处。该库使用安装在 GAC 中的其他库。
已发布新版本的第三方 DLL,v1.2。 Program Files文件夹中的DLL被新版本替换;在 GAC 中,这两个版本共存。
问题是在安装v1.2 时让应用程序(使用DLL 编译v1.1)工作,无需重新编译,也无需更改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 我是这个地狱的维护者......