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 客户端和服务器的完整示例,没有配置文件(所有程序化)

创建一个类库,它将在其他两个程序(您的客户端和服务器)之间共享,其中包含一个接口。

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

方案一,服务端:
添加对上面类库的引用。

[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();
}

方案二、客户端:
添加对上面类库的引用。

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是 .NET 框架中的一项技术,可为您处理此问题。它自动管理所有通信(套接字)以及跨多种传输技术的对象传输。

于 2012-09-27T17:27:36.900 回答