实施特定版本的第三方程序集

时间:2016-09-14 12:04:24

标签: c# .net dll gac

我的应用程序依赖于一组第三方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

我的错误在哪里?我该如何解决?

谢谢,

1 个答案:

答案 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();