C# 没有序列化的.NET服务容器

C# 没有序列化的.NET服务容器,c#,.net,wcf,C#,.net,Wcf,我正在寻找一个用于.NET的框架/容器,它允许我在运行时创建、使用服务(真正意义上的服务,而不是“web”服务),所有调用和数据传输都在.NET中,而无需序列化为SOAP或HTTP(如WCF) 外面有类似的东西吗? 谢谢WCF没有限制您通过HTTP使用SOAP——这是一个常见的误解。您可以将WCF与许多不同的底层应用程序一起使用 WCF是几乎每个人都会使用的一种方式——无论是那种方式还是.NET远程处理,但是你再也看不到太多的.NET远程处理了。如果你试图将数据传输到当前正在执行的AppDoma

我正在寻找一个用于.NET的框架/容器,它允许我在运行时创建、使用服务(真正意义上的服务,而不是“web”服务),所有调用和数据传输都在.NET中,而无需序列化为SOAP或HTTP(如WCF)

外面有类似的东西吗?
谢谢

WCF没有限制您通过HTTP使用SOAP——这是一个常见的误解。您可以将WCF与许多不同的底层应用程序一起使用


WCF是几乎每个人都会使用的一种方式——无论是那种方式还是.NET远程处理,但是你再也看不到太多的.NET远程处理了。

如果你试图将数据传输到当前正在执行的AppDomain之外,将会有某种序列化,但你可以控制它是什么

WCF允许二进制、SOAP和自定义序列化程序。就通信方法而言,您仍然有很多选项,WCF将在本机上支持命名管道、TCP、HTTP以及自定义选项。如果您在一台机器内操作,命名管道可能适合您的账单,因为它使用共享内存,可以产生高吞吐量、低延迟的IPC

如果您不需要分离AppDevices,请考虑使用IOC容器,如Unity()或任何其他选项:IOC容器将允许您实例化“服务”并调用它,而不知道如何实例化对象。它可以提供WCF和其他web服务所必需的一些解耦好处


tl;dr:如果使用两个进程,则始终会有序列化。试着避免性能受到影响。

所以。。。可以在没有任何类型序列化的情况下在服务之间进行通信吗?不可以。如果您想通过网络发送对象,根据定义,无论您使用什么框架,您都在使用序列化,正如Mitch在回答中所回避的那样。不过,有些对象永远无法真正序列化。例如,Windows窗体中的图形设备上下文。这是特定于应用程序的,无论使用何种框架,都无法序列化。你可以滚动你自己的框架,只需推送字节,但我保证,这不会很有趣。我的意思是,如果有一个框架本质上管理类和对象——有点像依赖注入框架,但也管理运行时、启动和关闭时的服务获取。就像一个小操作系统。在这种情况下,人们只需“推”对象,因为.NET中的一切都在进行。我在解释这一点上真的做得很差,不是吗?一旦你开始谈论“在电线上”移动对象(或将其推来推去),你就必须序列化/反序列化。CLR中的对象存储未定义,并且在内存中。只要您想将it模型从内存中传输出去,就必须定义如何完成。如果您愿意,您可以使用包含的序列化程序来完成这项工作,但这项工作在某个时候已经完成了。@drozzy:您所描述的是WCF。问题是,我们有一个约束,要求我们使用WCF与外部客户端通信。我认为将我们的一些组件也作为服务来编写是有意义的——如果WCF在“域”内时在.NET中进行通信,我们会设置它。如果您愿意,您可以将WCF同时用于这两个方面。你有很多关于WCF的阅读和背景知识,它是什么,它在国际海事组织是如何运作的。谢谢,我认为国际奥委会对我来说可能已经足够了。但是,如果我不想将数据传输到AppDomain之外,但仍然想要服务的所有优势,比如在运行时动态获取服务的能力,那该怎么办呢?如果将WCF服务客户端封装在一个处理生命周期、服务位置和绑定的小型代理中,您可以通过IOC公开WCF服务。然后,服务的客户端不知道它是来自WCF还是只是接口的本地实现。但是,使用此路由确实需要克服很多问题,不限于WCF通道生存期、多线程客户端、模拟和最大的异常处理。由于客户端不知道它是WCF,您需要将FaultException映射到其他类型。@PeterRitchie但这还不包括序列化为二进制并从中反序列化吗?我不确定,当然,二进制涉及到从二进制序列化到二进制。但您的问题详细介绍了SOAP或HTTP,这两种协议在WCF中都不是必需的,您可以通过TCP使用二进制,通过命名管道使用二进制,等等。。。并不是说SOAP或XML不是“.NET”…当您在一个简单的程序中调用方法
string getFoo()
时,会发生什么?字符串被序列化了吗?否-您只得到一个指向内存位置的指针。这就是我要问的——一个服务中的对象是否只能通过引用传递。你不能将指向内存的指针从一个进程传递到另一个进程——它们有自己的地址空间。@PeterRitchie你是对的,但是如果服务位于同一个进程中呢?