ClientBase <tchannel>和ChannelFactory <tchannel>的代码生成?</tchannel> </tchannel>

时间:2014-03-13 06:01:12

标签: c# wcf generics inheritance interface

我正在研究ClientBaseChannelFactory中使用的使用模式,有一点我无法理解。

在大多数示例中,我们都有此用法

public class MyClient : ClientBase<IMySvcContract>, IMySvcContract {

    // IMySvcContract Interface method
    public string MyOperation(int param)
    {
        return this.Channel.MyOperation(param);
    }
}

这是客户端通过频道调用服务方法的示例。但是,当我仔细观察时,ClientBase没有MyOperation()的任何实现,它只知道IMySvcContract中定义的公共接口。

因此,当调用this.Channel.MyOperation()时,它实际运行的是哪个代码块? 它是否生成了在运行时实现TChannel的代码?如果是这样,这个模式怎么可能实现?“

编辑:在最简单的情况下,只有2个类具有ISvcContractClientServer的实现。创建对象和类型转换为接口类型的模式没有意义,这是获取我所知道的实际代码的唯一可行方法。

编辑2:经过进一步研究,我现在了解到可以生成一个在运行时实现TChannel接口的类。运行时代码生成到这个程度对我来说是新的。 Reference。结果,问题略有改变。

1 个答案:

答案 0 :(得分:3)

ClientBase将您的服务合同作为类型参数接收,并通过Channel属性公开此类型的实例。

渠道本质上是服务通信层的代理。

此代理对象的实际生成发生在CLR的深处(而不是.NET Framework类库)。我不确定CLR是如何生成代理的,但它是非常低级的东西。

<强>更新

我通过通道工厂跟踪代码到RealProxy类,System.Runtime.Remoting.RemotingServices类(mscorlib)和实际完成工作的extern CreateTransparentProxy方法。

我学到了一些发现,并且我分享了这些知识,因为.NET Framework中不存在“代码块”,这就是我所说的低级别。