gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:36:22 24 4
gpt4 key购买 nike

我正在研究 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com