2

我有一个名为 的类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();
4

2 回答 2

3

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

通常,这就是WCF 命名管道用于.

取自链接:

[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;
        }
    }
}
于 2012-09-09T08:13:38.290 回答
1

您能否不仅拥有一个启动并启动 DoAction() 方法的工作应用程序。然后使用任何进程间通信方法(如命名管道)在它们之间进行通信。

这很好地解释了,匿名管道与我提到的命名管道相反。

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

于 2012-09-09T08:49:44.890 回答