Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 渠道工厂是如何运作的<;T>;。创建频道工作?_C#_Wcf - Fatal编程技术网

C# 渠道工厂是如何运作的<;T>;。创建频道工作?

C# 渠道工厂是如何运作的<;T>;。创建频道工作?,c#,wcf,C#,Wcf,如果我有一个接口: public interface ISomething { void DoAThing(); } 然后我用ChannelFactory实例化它: var channel = new ChannelFactory<ISomething>().CreateChannel 或 或 MyISomething接口不继承这些接口中的任何一个 那么,CreateChannel方法返回了什么类型的对象?它是如何构造一个动态对象的,能够实现一个在运行时才知道的接口的?返

如果我有一个接口:

public interface ISomething
{
    void DoAThing();
}
然后我用ChannelFactory实例化它:

var channel = new ChannelFactory<ISomething>().CreateChannel

MyISomething接口不继承这些接口中的任何一个

那么,CreateChannel方法返回了什么类型的对象?它是如何构造一个动态对象的,能够实现一个在运行时才知道的接口的?

返回一个实现,它是通常称为TransparentProxy或“Remoting”的一组工具的一部分,这是一种稍微过时的预wcf技术。为了创建实现接口的实际类,它归结为一个名为.CreateTransparentProxy(…)的内部框架级方法,我没有看过,但它很可能是某种类型的类生成器/发射器


正如你所要求的,你可能想自己做类似的事情。要在运行时实现接口,我建议使用无需太多努力即可实现接口或抽象类的接口。

如果您喜欢使用dotPeek或Reflector之类的反编译器,您可以自己深入兔子洞看看……我认为它不是一个
动态的
对象,只是一个生成的对象。在.NET中生成代码相对容易。至于解释“内部框架级方法”,这里有一个很好的回答
((IClientChannel)channel).Close
((IChannel)channel).Close
((ICommunicationObject)channel).Close