2008-11-24 66 views
35

我有一个应用程序需要在多个AppDomain之间发送适量的消息。我知道我可以使用远程实现,但我也注意到有跨域代理。有没有人看过这种问题?如何最好地在AppDomains之间进行通信?

+0

使用命名管道的WCF看起来像我最喜欢的 - 我至少可以避免进入网络的必要性。感谢大家! – 2008-11-24 15:34:24

+0

有关详细说明这项技术?例如,与AppDomain和MBRO(MarshalByRefObject)相比,使用命名管道的性能成本以及易用性如何。 – 2012-01-19 22:18:19

回答

25

我使用WCF和命名管道绑定取得了很好的成功。使用命名管道不会创建网络流量并使用二进制编码,因此它应该非常快速,而不会牺牲在未来扩展方案中分发的能力。

编辑: 请参阅here了解更多详细信息,包括实施示例的链接。

3

这只是一个快速的想法,但我听说即使是跨域通信WCF将是推荐的方法,当然从.NET 3.0开始。其实这是有道理的,因为远程处理只是WCF包装的另一项技术。

12

跨域委托只允许使用零参数的void方法,这可能不是您认为的那样。作为从一个appdomain到另一appdomain进行通知的简单回调,例如像InitComplete()之类的方法。

远程处理是唯一的选择,无论是将其称为WCF还是其他类型,传递可串行化类型或使用MBRO类型(MarshalByRefObjects)。这不像你想象的那么难。

-Oisin

9

我才发现,原来你也可以使用AppDomain.SetData但这只是一种方式 从主机域名到子域。

static void RunInChildDomain() 
{ 
    AppDomain childDomain = AppDomain.CreateDomain("friendlyName"); 
    string parameterValue = "notmii"; 
    childDomain.SetData("parameter", parameterValue); 
    childDomain.DoCallBack(PrintName); 
} 

static void PrintName() 
{ 
    string Name = Convert.ToString(AppDomain.CurrentDomain.GetData("parameter")); 
    Console.WriteLine(Name); 
} 

您也可以通过使用AppDomain.FirstChanceException事件创建子和主机应用程序域之间的异常驱动的通信:)

1

我想在x开的答案扩大。他建议使用WCF或MarshalByRefObject,但考虑到问题是关于AppDomain之间的通信,而不是关于进程之间的通信,我认为MBRO方法的实现简单得多,因此是正确的答案。

当我自己研究这个问题时,我首先努力了解孩子AppDomain如何与父母沟通,直到我意识到您可以将一个MBRO对象的句柄传递给孩子,然后孩子可以解开该句柄以传回父(或任何其他AppDomain)。我发布了一个解决方案给我自己的问题here

我后来得知您可以定义一个接口,在复杂的类上实现该接口,然后只传递一个句柄到接口。这可以大大减少加载子AppDomain可能需要的程序集数量。

相关问题