2

私は次のようなC#のインターフェースを持っています:

interface ITest
{
    int Method1(int something);
}

すべてのメソッドには、基本型 (整数、文字列、列挙型) のパラメーターがあります。

ここで、ソケットを介して通信する別のマシンで実装とクライアントを実行したいと考えています。手動でできることは、次のような実装を行うことです。

class Test : ITest
{
    int Method1(int something)
    {
        m_Serializer.Serialize(something, m_Socket);
        int result = (int)m_Serializer.Deserialize(m_Socket, typeof(int));
        return result;
    }
}

それを自動化する方法、つまり、特定のインターフェース用にそのようなラッパーを自動的に生成する方法はありますか?

を介して手動で生成することもできますReflection.Emitが、それは非常に複雑です。簡単な方法はありますか?

4

2 に答える 2

3

WCF(Windows Communication Foundation)はあなたが探しているものです。これはほぼ正確に実行されますが、学習曲線はやや急です。

私はそれを、あなたのインターフェース、つまりサービス契約によって定義されるネットワーク「プロトコル」を自動的に生成するフレームワークと考えるのが好きです。「プロトコル」は、基盤となるネットワークトランスポートからも独立しています。生のTCP、HTTP、HTTPSのバインディングがあり、すべて異なるユースケースを念頭に置いています。

プロトコルまたはバイトレベルでネットワークトラフィックが実際にどのように見えるかを実際に気にする必要はありません。すべての作業がシームレスに行われます。

賢いもの、学ぶ価値があります。

構成ファイルを使用しない、プレーンTCPを介したWCFクライアントとサーバーの完全な例(すべてプログラムによる)

インターフェイスを含む、クライアントとサーバーという他の2つのプログラム間で共有されるクラスライブラリを作成します。

[ServiceContract]
public interface IMyApi
{
    [OperationContract]
    string SayHello(string s);
}

プログラム1では、サーバー:
上記のクラスライブラリへの参照を追加します。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class MyApi : IMyApi
{
    public string SayHello(string s)
    {
        return "Hello " + s;
    }
}

static void Main()
{
    var api = new MyApi();
    var svcHost = new ServiceHost(api, new Uri("net.tcp://localhost:12345/MyService"));
    svcHost.Open();
    Thread.CurrentThread.Join();
}

プログラム2、クライアント:
上記のクラスライブラリへの参照を追加します。

static void Main()
{
    var binding = new NetTcpBinding();
    var endpoint = new EndpointAddress("net.tcp://localhost:12345/MyService");
    var cf = new ChannelFactory<IMyApi>(binding, endpoint);
    var client = cf.CreateChannel();

    Console.WriteLine(client.SayHello("Tom")); // output on the console should be "Hello Tom"
} 
于 2012-09-27T17:27:25.227 に答える
2

自分でデータをシリアル化して(シリアル化を参照)、反対側で逆シリアル化することもできますが、より良いオプションがあります。

Windows Communication Foundationは、これを処理する.NETFrameworkのテクノロジです。すべての通信(ソケット)と、複数のトランスポートテクノロジー間でのオブジェクトの転送を自動的に管理します。

于 2012-09-27T17:27:36.900 に答える