How to send strings to a WinForms application from another application using methods

眉间皱痕 提交于 2019-12-12 02:07:24

问题


I have an EXE that I've created called logger which is a simple WinForms application. It has a richtextbox and that's pretty much it.

I then also have a suite of other applications. What I want to be able to do with these apps is to be able to get them to write output to the logger.exe I have full control over the code of all applications.

I understand I could do a process.start and specify arguments but I want these apps to be able to write to the richtextbox at will based on the methods being called within them.

I was hoping I could create an api in the logger.exe that would expose a method for appending the richtextbox.

Does anyone have any tips on how I might achieve this?

EDIT: This is what I have so far:

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:


As you might have already guessed you would need any of IPC(Inter Process Communication) mechanism to send messages between different processes(Applications). WCF is one of the option, You could implement a simple WCF service module which uses net.pipe binding. This service can be hosted in managed application. In your case this service can be hosted in your logger application.

Note: If you want to host a WCF application in a managed application, Particular managed application(Logger) should have admin privilege.

Implementation of Logger Form

partial class declaration

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

Introduce Interface for communication

This interface should be added to a assembly which is accessible by both Logger application and any other application which sends message to logger.

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

Implementing Interface

Add the following method implementation to your Logger form

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

Hosting the WCF service in logger application

Invoke HostTheNetPipeService() within the constructor of Logger Form

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

Call the service from other applications to send message/text

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();
  }
}


来源:https://stackoverflow.com/questions/26841753/how-to-send-strings-to-a-winforms-application-from-another-application-using-met

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!