强制执行特定版本的第三方程序集

Enforce a specific version of a third-party assembly

我有一个应用程序依赖于一组第三方 DLL,版本 v1.1。为了使用它们,我引用了主要的,它位于 Program Files 文件夹下的某处。该库使用其他库,安装在 GAC 中。

发布了新版本的第三方 DLL,v1.2。 Program Files文件夹中的DLL被新版本替换;在 GAC 中,两个版本共存。

问题是让应用程序(用 DLL v1.1 编译)在安装 v1.2 时运行,而不重新编译它,也不更改 app.exe.config 文件。

我是 DLL 的维护者;额外的限制是Program Files中只安装最新版本的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 位于同一位置。我从 documentation 的理解是应该选择 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();