我有一个大型应用程序,该应用程序通过.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
导致对象从缓存中恢复其状态。