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

时间:2014-11-10 10:36:34

标签: c# winforms api logging ipc

我有一个我创建的EXE,名为logger,它是一个简单的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);
  }
}

1 个答案:

答案 0 :(得分:2)

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

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

Logger表格的实施

partial class declaration

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, InstanceContextMode = InstanceContextMode.Single)]
public partial class Logger: Form, IFromClientToServerMessages

介绍沟通界面

此接口应添加到一个程序集中,Logger应用程序和向记录程序发送消息的任何其他应用程序都可以访问该程序集。

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

实施界面

将以下方法实施添加到您的Logger表单

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

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

在Logger Form

的构造函数中调用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);
                }
            }
        }

Closing the communication channel

private void CloseChannel(ICommunicationObject channel)
{
  try
  {
     channel.Close();
  }
  catch (Exception ex)
  {

  }
  finally
  {
     channel.Abort();
  }
}