c# - ClientBase<TChannel> 和 ChannelFactory<TChannel> 的代码生成?

标签 c# wcf generics inheritance interface

我正在研究 ClientBase 中采用的使用模式和 ChannelFactory有一点我无法理解。

在大多数例子中,我们都有这种用法

public class MyClient : ClientBase<IMySvcContract>, IMySvcContract {

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

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

因此,当this.Channel.MyOperation()被调用时,它实际运行的是哪一段代码? 它是否在运行时生成了实现 TChannel 的代码?如果是这样,还可以如何实现这种模式?”

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

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

最佳答案

ClientBase 将您的服务契约(Contract)作为类型参数,并通过 Channel 属性公开此类型的实例。

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

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

更新:

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

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

关于c# - ClientBase<TChannel> 和 ChannelFactory<TChannel> 的代码生成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22370292/

相关文章:

c# - 避免在 Action 中渲染 View 的正确方法

c# - 如何限制wcf服务中的安全协议(protocol)

wcf - 我可以使用Delphi 2010构建WCF服务器吗?

swift - 在基类中使用 Swift 泛型可以轻松地将类型类返回给子类

Java 泛型运算符

C# 将字节数组转换为字符串,使用序言或默认编码

c# - 我如何处理可能异步也可能不异步的接口(interface)方法?

c# - 加快 SQL Server 2008 中 185k 行的更新?

c# - 我怎样才能让 WCF 路由给我一个比没有匹配的 MessageFilter 更详细的错误消息?

entity-framework - WCF RIA 通用服务器端查询?