如何最好地在AppDomains之间进行通信?
我有一个应用程序需要在多个AppDomain之间发送适量的消息。 我知道我可以使用远程实现这一点,但我也注意到,有跨域代表。 有没有人看过这种问题?
我使用WCF和命名pipe道绑定取得了很好的成功。 使用命名pipe道不会产生networkingstream量,并使用二进制编码,所以它应该是相当快的,而不会牺牲在未来扩展scheme中分发的能力。
编辑:请参阅这里更详细的信息,包括一个实施例子的链接。
跨域委托只允许一个无参数的void方法,这可能不是你想象的那样。 这只是一个简单的callback通知目的从一个appdomain到另一个,例如像InitComplete()或类似的方法。
远程处理是唯一的select,无论是将其称为WCF还是其他任何types,传递可序列化types或使用MBROtypes(MarshalByRefObjects)。 这不像你想的那么难
-Oisin
我刚发现你也可以使用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事件:)创build子和主机appdomain之间的exception驱动的通信
这只是一个快速的想法,但我听说即使是跨域通信, WCF也是推荐的方法,当然,从.NET 3.0开始。 其实这是有道理的,因为远程处理只是WCF包装的另一种技术。
我想扩大xOn的答案。 他build议使用WCF或MarshalByRefObject,但考虑到问题是关于AppDomain之间的通信,而不是关于进程之间的通信,我认为MBRO方法的实现要简单得多,因此是正确的答案。
当我自己研究这个问题的时候,我开始努力去理解孩子AppDomain如何与父母沟通,直到我意识到你可以把一个MBRO对象的句柄传递给孩子,然后孩子可以解开那个句柄通信回到父(或任何其他AppDomain)。 我在这里发布了一个解决我自己的问题。
后来我知道你可以定义一个接口,在一个复杂的类上实现这个接口,然后只传递一个句柄到接口。 这可以大大减less可能需要加载子AppDomain的程序集数量。