使用.net remoting调用本地“远程”

本文关键字:远程 net remoting 调用 使用 | 更新日期: 2023-09-27 18:08:02

我有一个大型应用程序,它使用COM通过。net远程从web层调用到中间层。在这种模式下启动和运行相当慢。COM边界的两边都是我们的代码。

我希望能够(可选地)在单个进程中运行它。相当多的行为依赖于调用ServicedComponents并将其所有参数序列化,并且对组件内部对象所做的更改不会泄漏,除非参数是一个'ref'参数。

我目前的计划是在不需要改变太多代码的情况下将这个双进程应用程序强制转换为单个进程,方法是使用一个带有自定义。net远程的虚假中间层边界。

如果我改变所有的

class BigComponent : ServicedComponent {
   ...
}

[FakeComponent]
class BigComponent : ContextBoundObject {
   ...
}

然后我可以写一个自定义的ContextAttribute来伪造进程边界,并使参数序列化自己:

[AttributeUsage(AttributeTargets.Class)]
public class FakeComponentAttribute :
  ContextAttribute,
  IContributeServerContextSink
{
   ... lots of stuff here
}

根据http://msdn.microsoft.com/en-us/magazine/cc164165.aspx

现在这工作得很好,到目前为止,我可以拦截对这些类的方法的所有调用。然而,我只能查看IMethodCallMessage。参数在IMessageSink中。ProcessMessage调用——我似乎无法用我选择的对象替换它们。

任何时候我改变IMethodCallMessage中的条目。Args数组,我的更改被忽略。从我在Reflector中可以看出,这个接口是运行时本身的本机对象的包装器,我不能写入这个对象,只能读取它。

如何在。net远程处理中修改方法调用的参数?

我需要实现我自己的频道吗?是否有"本地"频道教程可供我参考?

我的目标是让这些组件像远程对象一样工作(因为它们的所有参数在进入方法的过程中被序列化,它们的返回值在退出的过程中被序列化),但是让远程端点在同一个进程中。

使用.net remoting调用本地“远程”

我还没有找到一种方法来编辑参数数组,因为它通过IMessageSink .

最后,我不得不让参数对象类意识到这个问题,并实现一个新的接口IFakeRemotingAware。这允许复杂的对象参数在使用远程处理时表现出由于序列化/反序列化而导致的按值传递行为来模拟使用假远程处理时的行为。

接口有两个方法:EnteringFakeRemote使对象缓存其状态的本地副本,LeavingFakeRemote使对象从缓存中恢复其状态。