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

Moo*_*ght 5 c# dll communication winforms

全部。首先,我知道从 dll 将数据发送回 .exe的问题,但是那里的答案给我留下了太多开放的结局,而且由于我对尝试的内容没有经验,所以我觉得有必要提出一个新问题。

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

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

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

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

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

编辑

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

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

小智 3

您对 IPC(进程间通信)有多种选择,例如:Mailslot、NamedPipe、内存映射文件、Socket、Windows Messaging、COM 对象、Remoting、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 对象是另一种方式,它不像其他方式和 app 那样简单。必须在相同的安全上下文上运行才能访问相同的 COM 对象。

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

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