gpt4 book ai didi

c# - 使用 .net remoting 调用本地 "remote"?

转载 作者:太空宇宙 更新时间:2023-11-03 16:41:36 26 4
gpt4 key购买 nike

我有一个大型应用程序,它通过 .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 中所知,此接口(interface)是运行时本身中本地对象的包装器,我无法写入此对象,只能读取它。

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

我需要实现自己的 channel 吗?有没有我可以引用的“本地” channel 教程?

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

最佳答案

当参数数组通过 IMessageSink 时,我还没有找到编辑参数数组的方法。

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

该接口(interface)有两个方法:EnteringFakeRemote 使对象缓存其状态的本地副本,以及 LeavingFakeRemote 使对象从缓存中恢复其状态.

关于c# - 使用 .net remoting 调用本地 "remote"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7366410/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com