[英]Enforce a specific version of a third-party assembly
我有一个依赖于一组第三方DLL版本v1.1
的应用程序。 为了使用它们,我引用了主程序,该程序位于Program Files文件夹下的某个位置。 该库使用GAC中安装的其他库。
发行了新版本的第三方DLL v1.2
。 Program Files文件夹中的DLL被新版本替换; 在GAC中,两个版本共存。
问题是在安装v1.2
时,无需重新编译,也无需更改app.exe.config
文件,即可使应用程序(与DLLs v1.1
一起编译)能够正常工作。
我是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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.