2

という名前workerのクラスがあります。このクラスの新しいインスタンスを新しいプロセスで作成したいと思います。
しかし、新しいプロセスで開かれ、データを送受信できるようになった後、このクラスと通信できるようにしたいと思います。

私がやりたいのはworker()、新しいインスタンスを呼び出すたびに新しいプロセスで開かれるため、タスクマネージャーでworker.exeがたくさん表示されるようにすることです。

以前はvbcomラッパーを使用していましたが、今は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 に答える