gpt4 book ai didi

c# - 在进行跨应用程序域开发时,如何以与代理相同的方式赋予委托(delegate)无限生命?

转载 作者:太空宇宙 更新时间:2023-11-03 14:20:34 25 4
gpt4 key购买 nike

背景
我使用 Observer/Event Pattern 的派生开发了一个自定义插件架构以及以下代码的点点滴滴:

Code Project: Plugin Manager
Microsoft: AppDomains
Daniel Soltyka: Simple Plugin

我过去遇到过问题。每个插件都加载到它自己的应用程序域中,这样他们就无法看到彼此,也看不到主应用程序域中的东西(我们的应用程序中有我们不希望插件开发人员看到的专有数据)。每个新的应用程序域/插件都会创建一个代理,以便与主应用程序的插件进行通信。问题是代理在 5 分钟左右后断开连接。这很容易通过覆盖 InitializeLifetimeService() 方法并返回 null ( reference ) 来解决。

问题

现在的问题是事情的另一面。我通过从主应用程序端向每个插件发送委托(delegate)来在插件端“注册”回调函数。然后插件可以调用这些委托(delegate),委托(delegate)将调用主应用程序中的函数。但是,委托(delegate)显然会像上述解释中的代理一样断开连接。

我读了this在 SO 上,ClientSponsor.Register() 方法听起来不错,但它需要一个“MarshalByRefObject”作为参数。我的是委托(delegate),所以没有骰子。

我想找到一种方法,让我的主要应用代理像插件代理一样跨应用域连接。

有什么想法吗?

最佳答案

好的,我想出了解决这个问题的方法。我所做的是改变我的方法并创建一个从 MarshalByRefObject 派生的单独代理对象,我重载了相同的 InitializeLifetimeService() 函数,这样它就不会断开连接。然后我将其作为插件用来与主应用程序通信的代理。

所以现在,我发送那个代理对象,而不是从主应用程序发送委托(delegate)给每个插件使用,每个插件通过它进行通信。有点像交换电话号码。插件向主应用程序发送它们的代理,然后主应用程序向每个插件发送它的代理。

关于c# - 在进行跨应用程序域开发时,如何以与代理相同的方式赋予委托(delegate)无限生命?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5558036/

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