2016-09-14 64 views
0

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

非常标准的DLL地狱。 *以某种方式* v1.2对象被创建,即使你不瞄准它。找到邪恶者的一个简单方法是让v1.2无法访问,将其从GAC中移除。现在它应该弹起,因为它无法再找到DLL。但很可能你必须向作者发送一个错误报告。 –

+0

@HansPassant我是这个地狱的维护者...... – piwi

回答

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