2012-08-13 80 views
0

这是一个关于设计方法的问题。我有限的COM经验和一点WCF经验。我的约束由应用程序环境给出,但我有一些设计灵活性。如何从VB6 DLL中打开WPF exe文件?

从VB6 DLL中,我需要启动,并与WPF应用程序通信。 WPF应用程序目前是一个exe文件,但如果有帮助的话,我可以让它成为一个图书馆。我想提供VB6 DLL和WPF应用程序之间的双向通信。我有一些灵活性来调整VB6 DLL的设计。

我正在开发使用VS2010 C#和.NET 4

多少成分,我应该使用?我可以用VB6 DLL启动WPF应用程序In-Proc吗?他们之间应该有第三个组件吗? COM +可以发挥有用的作用吗?我是否必须使整个WPF应用程序COM可见?有没有这样做的缺点?

我正在寻找一种可以原型设计的方法。我愿意研究细节。

+0

我真的不明白这不是一个真正的问题。 – 2012-08-13 22:32:53

回答

1

  1. 创建从WPF应用程序,使用WCF的Web服务。我会抽象出应该远程访问的WPF应用程序的那些方面。这将明确地而不是包括任何用户界面代码。
  2. 我会创建一个简单的类库项目,并使用“添加服务引用”来添加对WCF服务的引用。
  3. 我会做的类库的方法COM可见
  4. 我会打电话从VB6

这样将移除式用户界面的任何考虑的利益的方法。

+0

参考你的评论,这对我来说是一个真正的问题。 – JimBoone 2012-08-13 23:20:12

+0

为了便于说明,您建议添加第三个公开COM方法调用的组件,并通过服务通道与WPF应用程序进行通信。我有这个权利吗? – JimBoone 2012-08-13 23:25:24

+0

什么启动Web服务?这整套东西运行在个人用户盒子上。 Web服务在访问时是否启动? – JimBoone 2012-08-13 23:27:43

1

在可用的选项中,我喜欢COM选项而不是'启动另一个进程'选项,因为这种简单性使得'应用程序'间通信将通过方法调用而不是WCF或任何类似的方式进行。

我假设你的VB DLL生活在一个window'd过程中,而不是一个服务或Web应用程序。您只需将所有暴露的类型标记为COM可见,即类,它们的参数和返回类型。

您可能必须在Windows窗体ElementHost [1]内包装您的WPF UI,但我不确定,试试看。

我不确定如果您在搜索中看到这个[2],它听起来可以但不支持,只要你没有太多的事情发生。

[1] http://msdn.microsoft.com/en-us/library/system.windows.forms.integration.elementhost.aspx

[2] http://social.msdn.microsoft.com/forums/en-US/wpf/thread/7555ba6a-1359-4dfe-aa23-c31a8f121142/

0

我在一个主要用VB6编写的应用程序上工作,但是大多数最近的代码都是用.net编写的,并且内置了WPF和一些WinForms的UI组件。这个应用程序的数据源是WCF,MSSQL服务器和一个基于UNIX的服务器。所有的WCF调用都是由.net UI组件引用的数据访问组件构成的。

您可以在VB6窗口或其他容器控件中托管WPF。首先获取Interop Forms Toolkit并构建shell用户控件来托管您的WPF控件。

为了能够在这些控件中托管WPF,您需要构建一个包含ElementHost的WinForms用户控件,该控件可以将内容设置为WPF用户控件。

WPF用户控件

元主机
一个
的WinForms内内用户控件
一个
VB6用户控件或 窗口内

互操作的工具包将要建设VB.Net代码,但你可以在C#中完成,虽然我没有尝试过。由interop工具包创建的用户控件将作为COM组件公开,您可以通过Project> Components将它们添加为组件,然后在工具箱中找到它们。在数据源(WCF,数据库)等方面,您应该在.net组件中构建所有的数据访问,直接从UI组件引用,不要尝试回调到VB6库,您可能只需要创造一个混乱。

在我的应用程序中,我还有一个配置部分,我从VB6应用程序启动中调用,它为所有.net组件设置IoC容器。

从最佳实践方法,我实际上会建议您将VB6代码重写为.net并将VB6置于画面之外。如果这不是一个选项,那么你有很多选择,我的解释只是其中的一个。