【问题标题】:Enforce a specific version of a third-party assembly强制执行第三方程序集的特定版本
【发布时间】:2016-09-14 12:04:23
【问题描述】:

我有一个依赖于一组第三方 DLL 的应用程序,版本为 v1.1。为了使用它们,我参考了主要的,它位于 Program Files 文件夹下的某处。该库使用安装在 GAC 中的其他库。

已发布新版本的第三方 DLL,v1.2。 Program Files文件夹中的DLL被新版本替换;在 GAC 中,这两个版本共存。

问题是在安装v1.2 时让应用程序(使用DLL 编译v1.1)工作,无需重新编译,也无需更改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

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

谢谢,

【问题讨论】:

  • 相当标准的 DLL 地狱。 不知何故创建了一个 v1.2 对象,即使您没有针对它。找到作恶者的一种简单方法是使 v1.2 无法访问,将其从 GAC 中删除。现在它应该会爆炸,因为它再也找不到 DLL。但很可能您必须向作者发送错误报告。
  • @HansPassant 我是这个地狱的维护者......

标签: c# .net dll gac


【解决方案1】:

我在特定情况下找到了解决方案,重新阅读我的问题后我意识到我没有提到我的初始 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 2015-10-14
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多