在不同的过程中与班级沟通

时间:2012-09-09 08:09:38

标签: c# process communication

我有一个名为worker的类,我想在一个新进程中创建这个类的新实例 但是我希望能够在新的流程中打开并能够发送和接收数据后与该类进行通信。

我想要做的是,在worker()的任何调用中,新实例都将在新进程中打开,因此我可以在任务管理器中看到很多worker.exe。

我之前已经使用vb com包装器完成了但是现在我只想在C#和没有COM的情况下这样做, 我能以最基本的方式做到这一点吗?

上课的例子:

public class worker
{
    public worker()
    {
        // Some code that should be open in a new process
    }

    public bool DoAction()
    {
        return true;
    }
}

主程序示例:

worker myWorker = new worker();//should be open in a new process
bool ret = myWorker.DoAction();

2 个答案:

答案 0 :(得分:3)

您可以在WCF端点中公开您的操作。然后,从一个过程开始另一个过程。然后,您可以连接到该进程公开的端点以与之通信。

通常情况下,这就是WCF Named Pipes are used for

取自链接:

[ServiceContract(Namespace = "http://example.com/Command")]
interface ICommandService {

    [OperationContract]
    string SendCommand(string action, string data);

}

class CommandClient {

    private static readonly Uri ServiceUri = new Uri("net.pipe://localhost/Pipe");
    private static readonly string PipeName = "Command";
    private static readonly EndpointAddress ServiceAddress = new EndpointAddress(string.Format(CultureInfo.InvariantCulture, "{0}/{1}", ServiceUri.OriginalString, PipeName));
    private static readonly ICommandService ServiceProxy = ChannelFactory<ICommandService>.CreateChannel(new NetNamedPipeBinding(), ServiceAddress);

    public static string Send(string action, string data) {
        return ServiceProxy.SendCommand(action, data);
    }
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class CommandService : ICommandService {
    public string SendCommand(string action, string data) {
        //handling incoming requests
    }
}
static class CommandServer {

    private static readonly Uri ServiceUri = new Uri("net.pipe://localhost/Pipe");
    private static readonly string PipeName = "Command";

    private static CommandService _service = new CommandService();
    private static ServiceHost _host = null;

    public static void Start() {
        _host = new ServiceHost(_service, ServiceUri);
        _host.AddServiceEndpoint(typeof(ICommandService), new NetNamedPipeBinding(), PipeName);
        _host.Open();
    }

    public static void Stop() {
        if ((_host != null) && (_host.State != CommunicationState.Closed)) {
            _host.Close();
            _host = null;
        }
    }
}

答案 1 :(得分:1)

你能不能只有一个你启动的工作者应用程序并开始DoAction()方法。然后使用任何进程间通信方法(如命名管道)来进行通信。

这很好地解释了Anonymous pipes而不是像我提到的命名管道。

  

匿名管道提供的功能少于命名管道,但也需要更少的开销。您可以使用匿名管道更轻松地在本地计算机上进行进程间通信。您不能使用匿名管道通过网络进行通信。