我有一个我创建的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);
}
}
答案 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();
}
}