使用WCF在另一个CLR地址空间中执行代码并返回对象

lys*_*cid 5 .net c# wcf proxy remoting

经过一些阅读,我收集.NET Remoting是一个已弃用的API,已被WCF取代.

我正在编写一个自动化框架,并希望在本地或某些远程机器上引用类型/方法的DLL,并执行它们而不考虑它们执行的位置.

我认为Remoting是要走的路,因为我猜所有功能都是在代理对象上执行的,如果它是本地对象或远程,则无关紧要.

WCF如何执行这种操作(如果有的话)或.NET Remoting是要走的路?

或许还有其他一些我没有想到的选择?

Jak*_*lås 4

据我所知,没有什么神奇的方法可以完全透明地调用一个方法,而不管它在哪台机器上运行,包括.NET Remoting。然而,WCF 广泛使用代理,或者从 WSDL 文档自动生成,或者通过直接引用共享 dll 中的类型/接口。

因此,您可以创建一个包含一些方法的共享 dll,添加一些 WCF 管道(即从您想要公开的方法/类型中创建一个服务接口),然后决定是否在项目中直接/本地使用它们,或者访问它们通过代理。这使得远程调用方法变得相当容易。但请注意,您无法创建远程公开状态和功能的成熟类,保存实际对象的内存不会远程共享,毕竟,这只是一个“技巧”。

根据您的设置,您可以:

  • 使用命名管道进行机器内通信(最快)
  • 使用TCP进行内网通信(也相当快)
  • 使用HTTP/HTTPS进行 Internet 通信(最慢)

尽管调用远程方法(包括发送/返回复杂的数据结构)很容易,但 WCF 在内部创建了一个完整的通信堆栈,可能包含大量逻辑,包括安全性、事务和可靠性等。这意味着远程通信是有代价的,会给 CPU 和网络带来压力。

可以在此处找到 WCF 入门知识。

如果您想要比内置通信选项更高的性能,您可能需要考虑使用Google Protocol Buffers之类的东西来减少传输的数据量并降低 CPU 负载。

对于 C#,据我所知,Protobuf CSharp 有两种实现,Jon Skeet 的Protobuf CSharp和 Marc Gravell 的Protobuf-net

最后一点是为了明确起见;不,WCF没有为您提供一种完全抽象类型/方法位置的方法。