强制执行第三方程序集的特定版本
本文关键字:版本 第三方 程序集 强制执行 | 更新日期: 2023-09-27 18:07:08
我有一个依赖于一组第三方dll的应用程序,版本为v1.1
。为了使用它们,我引用了主程序,它在Program Files文件夹下的某个地方。此库使用GAC中安装的其他库。
第三方dll新版本发布,v1.2
。"程序文件"文件夹中的DLL将被新版本替换;在GAC中,这两个版本共存。
问题是让应用程序(用dll v1.1
编译)在安装v1.2
时工作,而不重新编译它,也不改变app.exe.config
文件。
我是dll的维护者;额外的限制是,只有最新版本的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位于相同的位置。我从文档中的理解是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();