【问题标题】:How to open a WPF exe from within a VB6 dll?如何从 VB6 dll 中打开 WPF exe?
【发布时间】:2012-08-13 21:54:56
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我真的不明白这不是一个真正的问题。

标签: wpf wcf .net-4.0 com vb6-migration


【解决方案1】:

我愿意

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

这样做的好处是可以从等式中消除对用户界面的任何考虑。

【讨论】:

  • 参考您的评论,这对我来说是一个真正的问题。
  • 为澄清起见,您建议添加第三个组件,该组件公开 COM 方法调用,并通过服务通道与 WPF 应用程序通信。我有这个权利吗?
  • 什么启动 Web 服务?这整套东西在单独的用户盒子上运行。访问时 Web Service 是否启动?
  • 不,我会将 WPF 应用程序中的“服务”逻辑提取到 Web 服务中。该服务将由 WPF 应用程序和 VB6 应用程序调用。
  • 上面建议的这个解决方案有效。我创建了一个 WCF 服务库来保存所有通信定义。然后,我在 WPF 应用程序中自行托管了该库,并使用 WcfTestClient.exe 对其进行了测试。我已经有一个与 VB6 dll 交互的 COM 可见 dll,因此我从 COM 可见 dll 向 WCF 自托管应用程序添加了一个 ServiceReference。现在 COM 可见 dll 启动 WPF 应用程序,该应用程序自承载 WCF 命名管道端点。我必须实现一个“主机关闭”方法,以便 WPF 应用程序新的何时关闭自身。约翰,谢谢你的帮助。
【解决方案2】:

在可用的选项中,我更喜欢 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/

【讨论】:

    【解决方案3】:

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

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

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

    WPF 用户控件


    元素宿主



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

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

    就数据源(WCF、数据库)等而言,您应该在直接从 UI 组件引用的 .net 组件中构建所有数据访问,不要尝试回调 VB6 库,您可能只会创建一团糟。

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2013-03-04
      • 2022-07-25
      • 2013-02-03
      相关资源
      最近更新 更多