C# 用C语言在应用程序之间传递信息#

C# 用C语言在应用程序之间传递信息#,c#,winforms,dll,communication,C#,Winforms,Dll,Communication,全部。首先,我意识到这个问题,但是那里的答案给我留下了太多的未解之谜,因为我对我正在尝试的东西没有经验,我觉得有必要提出一个新的问题 我有一个现有的C#[此处所有WinForms]应用程序,它严重依赖SQL。客户要求我们提供一个SQL编辑器和库,可以用来开发和测试SQL,但也可以用来直接粘贴回主应用程序。新的SQLEditor是一个多线程应用程序,它解析并执行TSQL。我现在有一些事情要考虑;从主应用程序启动第二个应用程序的最佳方式是: 将第二个应用程序放入DLL并加载到主项目中,将第二个应用程

全部。首先,我意识到这个问题,但是那里的答案给我留下了太多的未解之谜,因为我对我正在尝试的东西没有经验,我觉得有必要提出一个新的问题

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

  • 将第二个应用程序放入DLL并加载到主项目中,将第二个应用程序作为新表单调用(
    SqlEditor sqlEd=new SqlEditor()
    等)?线程轰炸意味着什么?我是否需要
    [STAThread]
    ——因为我希望两个多线程应用程序同时可用并处于活动状态

  • 要作为独立的.exe从主应用程序启动吗

  • 取决于你的建议;在上述任一情况下-当第二个应用程序中的点击事件仍在运行且处于活动状态[WCF,
    ApplicationDomains
    etc]时,我将信息从第二个应用程序中的点击事件传递回主应用程序的最佳方式是什么?孩子们会来这里玩吗

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

    我计划使用一个按钮将所选SQL粘贴回主应用程序


    我也知道这里有很多问题,我为此道歉。非常感谢您的时间。

    如果您需要一种简单的方法来对两个WinForms应用程序进行outproc通信,那么为什么不使用带有自定义格式的
    剪贴板呢

    在源应用程序中:

        // 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通信机制。

    另一种实现应用程序内部通信的方法是使用Windows消息。您可以定义全局windows消息id并使用windows API调用,如SendMessage和PostMessage

    下面是一篇简单的文章,介绍了如何:

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


    根据我的经验,这肯定没有剪贴板方法那么脆弱。

    对于IPC(进程间通信),您有多种选择,例如: 邮箱、NamedPipe、内存映射文件、套接字、Windows消息传递、COM对象、远程处理、WCF。。。 http://en.wikipedia.org/wiki/Inter-process_communication

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

    通过WM_COPYDATA发送消息可以仅通过SendMessage完成,不支持PostMessage,这意味着通信是同步的

    使用outproc singleton COM对象是另一种方法,它不像其他方法那么简单,而且两者都适用。必须在同一安全上下文上运行才能访问同一COM对象

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


    如果这两个部分始终在同一台PC上运行,则将其中一个用作dll[inproc]更简单。使用套接字、远程处理等其他技术,WCF将为您提供更大的通信灵活性,即这两个部分只需稍作修改即可在不同的PC上运行…

    @slugster感谢您的编辑。最好的…没问题,这只是一个小小的编辑。看看这是否符合你的需要。这不是一种解耦的方法,但它非常灵活。namedpipes方法(在我看来)比WindowsMessages和Interop更适合这样做。然而,从目前为止我所读到的内容来看,当您不知道数据何时发送时,我看不到一种清晰的方式来读取发送的数据。很明显,没有什么事情值得倾听——你能在这方面提供建议吗?再次感谢…感谢您的回复。在最好的情况下,我使用夹持板的经验是脆弱的,因此我不愿意采用这种方法。我也不确定是否需要,因为必须有一种标准的方式来执行此类操作。再次感谢您的时间…感谢您的回复。“其中一些提供了双向沟通”你能在回答中说明哪些是双向沟通吗?因为这正是我需要的。谢谢你抽出时间……没问题。文件映射、管道和套接字以旧的方式提供双向通信(大多数事情都是您自己做的,您需要在它们周围实现多个包装器以获得高级编程API)。COM和远程处理提供了更现代的方法(已经实现了包装器!),传递对象更简单,您可以注册对象以通知更改(观察者模式)等等。使用windows消息传递不是一个好选择,尽管它很简单&u可以将其用作双向通信。根据您的回答,我尝试使用WCF的基本实现。然而,我有一些困难。我发布了一个新问题,你能解释一下吗?再次感谢。。。