2

サーバー アプリケーションとクライアント アプリケーションの間で通信できるようにしたいと考えています。どちらのアプリケーションも C#/WPF で記述されています。インターフェイスは、両方のアプリケーションが参照する別の DLL に配置されます。

interface-dll には、次のような IDataInfo-Interface があります。

public interface IDataInfo
    {
        byte[] Header { get; }
        byte[] Data { get; }
    }

サーバー アプリケーションは、次のコードでクライアントを呼び出します。

Serializer<IDataInfo> serializer = new Serializer<IDataInfo>();
IDataInfo dataInfo = new DataInfo(HEADERBYTES, CONTENTBYTES);
Process clientProcess = Process.Start("Client.exe", serializer.Serialize(dataInfo));

Client-Applications は、次の方法でサーバーからメッセージを取得します。

Serializer<IDataInfo> serializer = new Serializer<IDataInfo>();
IDataInfo dataInfo = serializer.Deserialize(string.Join(" ", App.Args));

Serializer-Class は、Soap-Formatter を使用してシリアル化/逆シリアル化する汎用クラスです。コードは次のようになります。

public class Serializer<T>
{
    private static readonly Encoding encoding = Encoding.Unicode;

    public string Serialize(T value)
    {
        string result;
        using (MemoryStream memoryStream = new MemoryStream())
        {
            SoapFormatter soapFormatter = new SoapFormatter();
            soapFormatter.Serialize(memoryStream, value);
            result = encoding.GetString(memoryStream.ToArray());
            memoryStream.Flush();
        }
        return result;
    }

    public T Deserialize(string soap)
    {
        T result;
        using (MemoryStream memoryStream = new MemoryStream(encoding.GetBytes(soap)))
        {
            SoapFormatter soapFormatter = new SoapFormatter();
            result = (T)soapFormatter.Deserialize(memoryStream);
        }
        return result;
    }
}

ここまではすべて正常に動作します。サーバーはクライアントを作成し、クライアントはその引数をIDataInfo-Object に逆シリアル化できます。

ここで、サーバーから実行中のクライアントにメッセージを送信できるようにしたいと考えています。メソッドを使用してInterface-DLLにIClient-Interfaceを導入しましたvoid ReceiveMessage(string message);

MainWindow.xaml.cs は IClient-Interface を実装しています。

私の質問は、Process-Object しかないときに、サーバーで IClient-Object を取得する方法です。について考えましActivator.CreateInstanceたが、これを行う方法がわかりません。プロセスのハンドルで IClient を取得できると確信していますが、方法がわかりません。

何か案が?

4

3 に答える 3

4

他の投稿では、一般的な方法はサービスを作成することであると述べているため、よりシンプルに保ちますServiceStackを見てみましょう。AFAIK ServiceStackはstackoverflowで使用されています

それについてのコースとして、pluralsightにもあります

ServiceStack は、任意の .net dll (iis などを使用せずに) でホストするのが非常に簡単で、WCF の構成の複雑さはありません。

また、何も構成する必要なく、エンドポイントを SOAP および REST として使用できます。

たとえば、これは hello world サービスを定義します

public class HelloService : IService<Hello>
{
    public object Execute(Hello request)
    {
        return new HelloResponse { Result = "Hello, " + request.Name };
    }
}

クライアント コードの例を次に示します。

var response = client.Send<HelloResponse>(new Hello { Name = "World!" });
Console.WriteLine(response.Result); // => Hello, World

ServiceStack.Helloで、より複雑な例とウォークスルーを見つけることができます。

于 2013-07-15T06:21:41.030 に答える
1

マルチプロセス間の通信には、さまざまな実装方法があります。ソケット、fileMapping、共有メモリ、Windows 32 メッセージなど。

たぶん、サンプルの方法は、WCF を使用できることです。

于 2013-07-15T06:03:18.813 に答える