强制执行特定版本的第三方程序集
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();
我有一个应用程序依赖于一组第三方 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();