C# 如何使用方法从另一个应用程序向WinForms应用程序发送字符串

C# 如何使用方法从另一个应用程序向WinForms应用程序发送字符串,c#,winforms,api,logging,ipc,C#,Winforms,Api,Logging,Ipc,我创建了一个名为logger的EXE,它是一个简单的WinForms应用程序。它有一个richtextbox,差不多就是这样 然后,我还有一套其他应用程序。我希望能够使用这些应用程序将输出写入logger.exe。我可以完全控制所有应用程序的代码 我知道我可以做一个process.start并指定参数,但我希望这些应用程序能够根据其内部调用的方法随意写入richtextbox 我希望我能在logger.exe中创建一个api,公开一个附加richtextbox的方法 有人对我如何实现这一目标有什

我创建了一个名为logger的EXE,它是一个简单的WinForms应用程序。它有一个richtextbox,差不多就是这样

然后,我还有一套其他应用程序。我希望能够使用这些应用程序将输出写入logger.exe。我可以完全控制所有应用程序的代码

我知道我可以做一个process.start并指定参数,但我希望这些应用程序能够根据其内部调用的方法随意写入richtextbox

我希望我能在logger.exe中创建一个api,公开一个附加richtextbox的方法

有人对我如何实现这一目标有什么建议吗

编辑:这是我到目前为止得到的:

namespace ScreenLog
{
  [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, InstanceContextMode = InstanceContextMode.Single)]
  public partial class Logger : Form, IFromClientToServerMessages
  {
      public Logger()
      {
          InitializeComponent();
      }

      public void DisplayTextOnServerAsFromThisClient(string text)
      {    
          LogConsole.AppendText(Environment.NewLine + text);
      }
  }
  [ServiceContract(SessionMode = SessionMode.Allowed)]
  public interface IFromClientToServerMessages
  {
      [OperationContract(IsOneWay = false)]
      void DisplayTextOnServerAsFromThisClient(string message);
  }
}

正如您可能已经猜到的,您需要任何IPC(进程间通信)机制来在不同的进程(应用程序)之间发送消息。WCF是选项之一,您可以实现一个简单的WCF服务模块,该模块使用
net.pipe绑定
。此服务可以托管在托管应用程序中。在您的情况下,此服务可以托管在记录器应用程序中

注意:如果要在托管应用程序中托管WCF应用程序,则特定的托管应用程序(记录器)应具有管理员权限

记录器表单的实现

部分类声明


引入通信接口

此接口应添加到记录器应用程序和向记录器发送消息的任何其他应用程序均可访问的程序集

[ServiceContract(SessionMode = SessionMode.Allowed)]
   public interface IFromClientToServerMessages
   {
       [OperationContract(IsOneWay = false)]
       void DisplayTextOnServerAsFromThisClient(string message);
   }

实现接口

将以下方法实现添加到记录器窗体中

public void DisplayTextOnServerAsFromThisClient(string text)
{
  //Add proper logic to set value to rich text box control.    
  richtextbox = text;
}

在记录器应用程序中托管WCF服务

在记录器窗体的构造函数中调用HostTheNetPipeService()

private void HostTheNetPipeService()
{
  serverHost = new ServiceHost(this);
  serverHost.AddServiceEndpoint((typeof(IFromClientToServerMessages)), new NetNamedPipeBinding(), "net.pipe://127.0.0.1/Server");
  serverHost.Open();
}

从其他应用程序调用服务以发送消息/文本

private void SendMessageToLogger()
{
    using (ChannelFactory<IFromClientToServerMessages> factory = new ChannelFactory<IFromClientToServerMessages>(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/Server")))
    {
       IFromClientToServerMessages clientToServerChannel = factory.CreateChannel();
                try
                {
                    clientToServerChannel.DisplayTextOnServerAsFromThisClient("Message to be displayed");
                }
                catch (Exception ex)
                {                   
                }
                finally
                {
                    CloseChannel((ICommunicationObject)clientToServerChannel);
                }
            }
        }

我总是用一个消息传递库来处理这样的东西,它非常可靠,也不太复杂。如果你只是想要一个快速简单的解决方案,你可能只想把一个文本文件保存在某个地方,其中一个程序写入其中,另一个每隔一秒钟检查一次,看看里面是否有什么东西,然后复制它Hi Vajura,谢谢你的建议我没有想到要做文本文件的事情,如果我每隔几分钟就做一次民意调查的话,这可能行得通。可能不是最有效率的,但是嘿。我会看看消息库。我会尝试一下。谢谢你的解释,Kurubaran,如果我能让它工作,这将是我的首选方法。这个运行的用户确实有管理员,所以这不应该是一个问题。@Jonkers让我知道如果你遇到任何问题,我可以帮助你。我不确定我是否了解如何在我的应用程序中托管WCF的全部内容。我猜WinForms应用程序什么时候启动,我想让它在网络下创建一个主机。pipe://localhost/Server@Jonkers抱歉错过了这一部分,添加了将服务托管到Logger表单中的方法。啊,现在看起来它正在工作。我想我只需要添加一些代码,等待应用程序完全启动。我刚刚做了一个测试,它确实将文本输出到了窗口!到目前为止看起来不错,非常感谢你的帮助!
private void SendMessageToLogger()
{
    using (ChannelFactory<IFromClientToServerMessages> factory = new ChannelFactory<IFromClientToServerMessages>(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/Server")))
    {
       IFromClientToServerMessages clientToServerChannel = factory.CreateChannel();
                try
                {
                    clientToServerChannel.DisplayTextOnServerAsFromThisClient("Message to be displayed");
                }
                catch (Exception ex)
                {                   
                }
                finally
                {
                    CloseChannel((ICommunicationObject)clientToServerChannel);
                }
            }
        }
private void CloseChannel(ICommunicationObject channel)
{
  try
  {
     channel.Close();
  }
  catch (Exception ex)
  {

  }
  finally
  {
     channel.Abort();
  }
}