在C#中传递应用程序之间的信息

所有。 首先我知道从dll将数据发送回.exe的问题,然而那里的答案给我留下了太多的开放性,因为我没有经历我正在尝试的东西,我觉得有必要提出新的问题。

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

  1. 将第二个应用程序转换为DLL并加载到主项目中,将第二个应用程序作为新表单调用( SqlEditor sqlEd = new SqlEditor()等)? 在线程轰炸方面有什么含义,我需要[STAThread] – 因为我希望两个multithreading应用程序同时可用并处于活动状态。

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

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

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

编辑

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

我也知道这里有多个问题 – 我为此道歉。 非常感谢你花时间陪伴。

IPC(进程间通信)有多种选择,例如:Mailslot,NamedPipe,内存映射文件,套接字,Windows消息传递,COM对象,远程处理,WCF …… http://msdn.microsoft.com/en-us/ library / 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上运行,只需稍作修改……

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

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

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

根据我的经验,这肯定不如剪贴板方法那么薄弱。

如果您需要一种简单的方法来执行两个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通信机制。