【问题标题】:Assembly reference issue in combination with com objects结合 com 对象的程序集参考问题
【发布时间】:2017-09-10 13:12:25
【问题描述】:

我们有一个 WPF 项目,它使用第三方库和几个内部包。 wpf 程序本身运行良好,程序集得到正确解析,代码运行良好。
该程序提供了从不同来源加载数据的可能性,具体取决于您如何启动它。如前所述,当它自己调用时,一切都很好,但是如果我们从不同的应用程序调用程序,这是通过提供一个控制器并将其注册为 COM 互操作来完成的,我们会遇到程序集引用问题。

[Guid("93BC7929-8A5F-43EA-AEAB-38B5034758E5")]
[ComVisible(true)]
public class ConnectionController : ControllerBase
{
    public override void Run()
    {
        var viewModel = new MainWindowViewModel();
        var view = new MainWindow {DataContext = viewModel};
        view.Show();
    }
}

由于 wpf 程序也是作为独立应用程序提供的,我们将控制器移到了不同​​的项目,该项目不引用很多程序集,例如某种 wpf 库。

控制器本身不再拥有任何逻辑,通常它会传递由 com 对象提供的某种数据,但总而言之,它所做的唯一一件事就是尝试在不同的项目中实例化 MainWindowViewModel。与控制器在同一个解决方案中的项目可以正确解析,但第三方的东西不是。

一旦我们通过控制器调用 wpf 程序,引用第三方库的项目就无法再解析它的引用并抛出异常。

解决此类问题的正确方法是什么?我们必须在 GAC 中注册第三方 dll 吗?还是我们必须调整它们的某种属性?我们无法理解它。感谢您提供有关参考资料及其解决方式的所有信息。

【问题讨论】:

  • “不同的应用程序”是问题所在。 CLR 仍然以正常方式查找程序集,首先是 GAC,然后是 EXE 文件的目录。即使该 EXE 不是托管应用程序。如果您在注册时使用了 /codebase,则只能自动找到具有 [ComVisible] 类型的 DLL。所以 GAC 解决了它并将 DLL 复制到其他应用程序的安装目录中解决了它。从技术上讲,您也许可以使 AppDomain.AssemblyResolve 工作,但重要的是您必须拥有一个客户端代码始终必须首先创建的上帝类。
  • @Hans Passant 非常感谢,这些信息解决了我们的问题,并让我们对这个话题有了更多的了解。您可以复制/粘贴您的评论作为答案吗?我想将问题标记为已回答
  • 只分享您在自己的帖子中使用的方法,我猜不出您决定做什么。将您的帖子标记为答案。

标签: .net wpf reference com .net-assembly


【解决方案1】:

感谢@Hans Passant,我们找到了解决问题的方法。对于第一次尝试,我们只是将所需的 dll 复制到执行程序集的文件夹中,它就像一个魅力。这不会是最终的解决方案,很可能我们会使用代码库,但也可以使用上帝类,因为控制器总是会首先创建。我认为我们会尽量保持控制器尽可能小,并让应用程序处理它如何获取资源。

【讨论】:

    猜你喜欢
    • 2010-11-30
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多