我的应用程序依赖于一组第三方DLL,版本v1.1
。为了使用它们,我引用了主要文件,它位于Program Files文件夹下的某个位置。该库使用安装在GAC中的其他库。
发布了新版本的第三方DLL v1.2
。 Program Files文件夹中的DLL被新版本替换;在GAC中,两个版本共存。
问题是让应用程序(使用DLL v1.1
编译)在安装v1.2
时工作,而无需重新编译它,也无需更改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
。
我的错误在哪里?我该如何解决?
谢谢,
答案 0 :(得分:0)
我在我的特定情况下找到了一个解决方案,并重新阅读我的问题,我意识到我没有提到我的初始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();