我有一个大型应用程序,该应用程序通过.net远程处理使用COM从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

到目前为止,现在一切正常,我可以截获这些类上的所有方法调用。
但是,我只能在IMessageSink.ProcessMessage调用中查看IMethodCallMessage.Args -我似乎无法用我选择的对象替换它们。

每当我更改IMethodCallMessage.Args数组中的条目时,我的更改都会被忽略。根据我在Reflector中的了解,该接口是运行时本身中本机对象的包装,并且我无法写入该对象,而只能读取它。

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

我需要实现自己的频道吗?我可以从那里找到“本地”频道教程了吗?

我的目标是使这些组件像远程对象一样工作(因为它们的所有arg在进入方法时都被序列化,并且其返回值在退出时被序列化),但是远程端点位于同一进程内。

最佳答案

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

最后,我必须使参数对象类意识到这一问题,并实现一个新的接口IFakeRemotingAware。这允许使用远程处理时由于序列化/反序列化而表现出val-by-val行为的复杂对象参数,而在使用伪远程处理时模拟该行为。

该接口有两种方法:EnteringFakeRemote导致对象缓存其状态的本地副本,而LeavingFakeRemote导致对象从缓存中恢复其状态。

10-05 23:01
查看更多