5

全部。首先,我知道Send data back to .exe from dll的问题,但是那里的答案给我留下了太多的开放式结局,因为我对我正在尝试的事情没有经验,所以我觉得有必要提出一个新问题。

我有一个严重依赖 SQL的现有 C# [ All WinForms here ] 应用程序。(客户)要求我们提供一个 SQL 编辑器和库,可用于开发和测试 SQL,但也可用于直接粘贴回主应用程序。新的 SQLEditor 是一个解析和执行 TSQL 的多线程应用程序。我现在有一些事情要考虑;从主应用程序启动第二个应用程序的最佳方法是什么::

  1. 将第二个应用程序制作成 DLL 并加载到主项目中,将第二个应用程序作为新表单(SqlEditor sqlEd = new SqlEditor()等)调用?我需要线程轰炸的含义是什么[STAThread]- 因为我希望两个多线程应用程序同时可用和活动。

  2. 要从主应用程序作为单独的 .exe 启动?

取决于您的建议;在上述任何一种情况下 - 我可以将信息从第二个应用程序中的点击事件传递回主应用程序的最佳方式是什么,同时它们仍然在运行和处于活动状态 [WCFApplicationDomains等]?观察者设计模式会在这里发挥作用吗?

为了让这个问题更有吸引力,这里是 SQL 编辑器:

编辑

我计划有一个按钮,将选定的 SQL 粘贴回主应用程序。

我也知道这里有多个问题——对此我深表歉意。非常感谢你花时间陪伴。

4

3 回答 3

4

如果您需要一种简单的方法来执行两个 WinForms 应用程序的 outproc 通信,那么为什么不使用Clipboard自定义格式呢?

在源应用程序中:

    // copy the data to the clipboard in a custom format
    Clipboard.SetData( "custom", "foo" );

在目标应用程序中,创建一个计时器以查看剪贴板:

    private void timer1_Tick( object sender, EventArgs e )
    {
        // peek the data of a custom type
        object o = Clipboard.GetData( "custom" );
        if ( o != null )
        {
            // do whatever you want with the data
            textBox1.Text = o.ToString();
            // clear the clipboard
            Clipboard.Clear();
        }
    }

这应该满足您的需求,并且它仍然非常简单,因为它不需要任何重量级的 outproc 通信机制。

于 2012-12-06T11:58:17.147 回答
4

完成应用程序内通信的另一种方法是使用 Windows 消息。您定义一个全局 Windows 消息 ID 并使用 Windows API 调用,例如 SendMessage 和 PostMessage。

这是一篇简单的文章,解释了如何: Ryan Farley 的文章“通过 Windows 消息在应用程序之间进行通信”

这实际上是观察者模式,接收所有指向当前窗口的 Windows 消息并挑选出您正在监听的消息。

以我的经验,这绝对没有剪贴板方法那么脆弱。

于 2012-12-06T12:11:45.847 回答
3

IPC(进程间通信)有多种选择,例如:邮槽、NamedPipe、内存映射文件、套接字、Windows 消息、COM 对象、远程处理、WCF ... http://msdn.microsoft.com/en-us/库/windows/desktop/aa365574(v=vs.85).aspx http://en.wikipedia.org/wiki/Inter-process_communication

其中一些提供双向通信,一些需要考虑系统安全性(防病毒和防火墙限制,您需要在其设置中将应用程序添加为例外)。

通过 WM_COPYDATA 发送消息只能通过 SendMessage 来完成,不支持 PostMessage,表示通信是同步的。

使用 outproc 单例 COM 对象是另一种方式,它不像其他方式和应用程序那么简单。必须在相同的安全上下文中运行才能访问相同的 COM 对象。

启动一个单独的应用程序可能会限制您可以传递的通信方式或数据类型,但将它们分开也将保护它们免受故障的影响(应用程序崩溃不会关闭另一个)。

如果这两个部分始终在同一台 PC 上运行,则将其中之一用作 dll[inproc] 会更简单。使用其他技术,如 Socket、Remoting、WCF 将为您提供更大的通信灵活性,即这两个部分可以在不同的 PC 上运行,只需稍加修改......

于 2012-12-06T19:15:55.077 回答