0

这是一个关于设计方法的问题。我有有限的 COM 经验和一点 WCF 经验。我的约束是由应用程序环境给出的,但我有一些设计灵活性。

在 VB6 dll 中,我需要启动 WPF 应用程序并与之通信。WPF 应用程序当前是一个 exe,但如果有帮助,我可以将其设为库。我想在 VB6 dll 和 WPF 应用程序之间提供两种方式的通信。我有一些灵活性来调整 VB6 dll 的设计。

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

我应该使用多少个组件?我可以使用 VB6 dll 在进程内启动 WPF 应用程序吗?它们之间是否应该存在第三个组件?COM+ 能起到帮助的作用吗?我是否必须使整个 WPF 应用程序 COM 可见?这样做有缺点吗?

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

4

3 回答 3

1

在可用的选项中,我更喜欢 COM 选项而不是“启动另一个进程”选项,因为“应用程序”间的通信将通过方法调用而不是 WCF 或类似的方式进行。

我假设您的 VB DLL 存在于窗口进程中,而不是服务或 Web 应用程序中。您只需要将任何公开的类型标记为 COM 可见,即类、它们的参数和返回类型。

您可能必须将您的 WPF UI 包装在 Windows 表单 ElementHost [1] 中,但我不确定,试试看。

我不确定您是否在搜索中看到了此 [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/

于 2012-08-13T22:07:14.900 回答
1

我会

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

这有利于从等式中消除对用户界面的任何考虑。

于 2012-08-13T22:29:40.557 回答
1

我在一个主要用 VB6 编写的应用程序上工作,但最近的大部分代码都是用 .net 编写的,其中 UI 组件内置在 WPF 和一些 WinForms 中。此应用程序的数据源是 WCF、MSSQL 服务器和专有的基于 unix 的服务器。所有 WCF 调用都是由 .net UI 组件引用的数据访问组件进行的。

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

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

VB6 用户控件或窗口内的 WinForms 用户控件内

元素主机
内的WPF用户控件



互操作工具包将要构建 VB.Net 代码,但您可以在 C# 中完成,虽然我没有尝试过。由互操作工具包创建的用户控件将作为 COM 组件公开,您可以通过 Project > Components 将它们添加为组件来引用 VB6,然后您将在工具箱中找到它们。

在数据源(WCF、数据库)等方面,您应该在直接从 UI 组件引用的 .net 组件中构建所有数据访问,不要尝试回调 VB6 库,您可能只会造成混乱。

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

从最佳实践方法来看,我实际上建议将您的 VB6 代码重写为 .net 并将 VB6 排除在外。如果这不是一个选项,那么您有很多选项,我的解释只是其中之一。

于 2012-08-13T22:58:10.843 回答