【发布时间】: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