全部。首先我知道问题Send data back to .exe from dll,但是那里的答案给我留下了太多的开放性,因为我没有经历过我正在尝试的事情,我觉得有必要提出新的问题。
我有一个很大程度上依赖SQL的C#[所有WinForms here ]应用程序。我们已被要求(由客户端)提供可用于开发和测试SQL的SQL编辑器和库,但也可用于直接粘贴回主应用程序。新的SQLEditor是一个解析和执行TSQL的多线程应用程序。我现在有一些事情需要考虑;从主应用程序::
启动第二个应用程序的最佳方法是什么将第二个应用程序转换为DLL并加载到主项目中,将第二个应用程序作为新表单调用(SqlEditor sqlEd = new SqlEditor()
等)?线程轰炸的含义是什么,我需要[STAThread]
- 因为我希望这两个多线程应用程序同时可用并处于活动状态。
要从主应用程序中作为单独的.exe启动吗?
取决于你的建议;在上述任何一种情况下 - 我可以将信息从第二个应用程序中的单击事件传递回主应用程序的最佳方式是什么,同时它们仍在运行且处于活动状态[WCF,ApplicationDomains
等等? Observer design pattern会来这里玩吗?
为了使这个问题更具吸引力,这里是SQL编辑器:
我计划有一个按钮,将选定的SQL粘贴回主应用程序。
我也知道这里有多个问题 - 我为此道歉。非常感谢您的时间。
答案 0 :(得分:4)
完成应用内部通信的另一种方法是使用Windows消息。您可以定义全局Windows消息ID并使用Windows API调用,例如SendMessage和PostMessage。
这是一篇简单的文章,解释了如何: Ryan Farley's article "Communication between applications via Windows Messages"
这实际上是观察者模式,接收指向当前窗口的所有Windows消息,并挑选出您正在侦听的消息。
根据我的经验,这肯定不如剪贴板方法那么脆弱。
答案 1 :(得分:3)
如果您需要一种简单的方法来执行两个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通信机制。
答案 2 :(得分:2)
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上运行,只需稍作修改......