2017-04-14 128 views
0

我们有一个WPF项目,它使用第三方库和一些内部软件包。 wpf程序可以正常工作,程序集可以正确解析并且代码工作得很好。
该程序提供了从不同来源加载数据的可能性,具体取决于您如何启动它。如前所述,当调用它自己的时候,它一切都很好,但是如果我们通过提供控制器并将其注册为COM interop来完成另一个应用程序的调用,我们会遇到程序集引用问题。装配参考问题与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 PROGRAMM被作为独立应用程序,还提供了我们提出的控制器到一个不同的项目不引用了很多大会的的,为WPF库的示例somekind的。

控制器自己不再拥有逻辑,通常它传递com对象提供的一些数据,但总而言之,它唯一要做的就是试图在不同的项目中实例化MainWindowViewModel。与控制器处于同一解决方案的项目已正确解决,但第三方的东西不是。

只要我们通过控制器调用wpf程序,引用第三方库的项目就无法再解决它的引用并引发异常。

解决这类问题的正确方法是什么?我们是否必须在GAC中注册第三方dll?或者他们的财产是我们必须调整的?我们无法绕过它。有关参考文献以及如何解决的每一个信息都会受到赞赏

+0

“不同的应用程序”是问题所在。 CLR仍按正常方式查找程序集,首先是GAC,然后是EXE文件的目录。即使该EXE不是托管应用程序。如果您在注册时使用了/ codebase,则只有具有[ComVisible]类型的DLL才能自动找到。因此GAC解决了这个问题,并将DLL复制到其他应用的安装目录中解决了这个问题。从技术上讲,你可能能够使AppDomain.AssemblyResolve工作,但重要的是你有一个上帝类,客户端代码总是必须首先创建。 –

+0

@Hans Passant非常感谢你,这些信息解决了我们的问题,并带来了对该主题的更多见解。你能复制/粘贴你的评论作为答案吗?我想将问题标记为已回答 – yRadwan

+0

只需分享您在自己的帖子中使用的方法,我无法猜测您决定要做什么。将您的帖子标记为答案。 –

回答

0

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