防止代码被加载到另一个 AppDomain

Posted

技术标签:

【中文标题】防止代码被加载到另一个 AppDomain【英文标题】:Preventing code being loaded to another AppDomain 【发布时间】:2014-03-03 09:49:27 【问题描述】:

我们有一个正常工作的 excel 插件,但我们没有为使用 AppDomains 设置任何东西。

但是,其他一些插件似乎强制我们的代码第二次加载,我们最终让我们的代码在两个不同的AppDomains 上运行(当我们想要执行一个动作时,我们会将它放入队列中AppDomain 1,然后 Excels OnTime 函数在队列为空的AppDomain 2 上运行 dequeue 方法。

所以,我的问题是:有没有一种简单的方法来解决这个问题,也许可以防止我们的程序被加载两次或被其他 AppDomains 加载?有没有人对如何解决这个问题有任何其他想法?

更新:

我们设法做的是,当我们被调用时,将我们的整个程序加载到其他插件的 AppDomain 中,现在我们在同一个地方遇到了最奇怪的问题(曾经是“通往其他域的网关”的地方,就像提到的动作队列函数):

每当出现这种情况时,SynchronizationContext.Current 似乎都会重置为 null,例如,每次调用功能区上的单击处理程序时,SynchronizationContext.Current 都会设置为 null。

我什至尝试调试 .Net 代码,碰巧框架记得旧的同步上下文,当一切恢复原状时,旧的同步上下文为空。

任何人都可以在这个问题上提供任何帮助,我真的开始失去它了吗?

【问题讨论】:

您好,它是网络应用程序还是基于胜利的解决方案。 老兄,认真的吗?如果问题本身包含大量关于 Excel 的讨论,绝对没有提及任何远程连接到网络或问题标签的内容,那么它就是:它是“基于胜利的解决方案”。我们有网络组件,但我认为它与这个问题完全无关。 不得不问,即使你使用的是 c# .net,解决方案的方法也会改变:) 您如何检查应用程序域?您是否在第二个应用程序域上调用负载。为什么需要 2 个应用程序域(是否创建了第二个应用程序域,然后从第一个应用程序域编组 - 对插件的结构一无所知)您正在使用的是 VSTO 项目吗?您谈论网关而不是两次加载代码,为什么?更多的上下文可能会有所帮助。 第一个应用程序域由 Excel 创建(默认域),第二个应用程序域由在我们之前加载的插件创建(它是第三方插件,我们无法控制它 - 意思,我们不需要它 - 我们甚至不想要它:D)。我们的项目不是 VSTO,它是 COM 和自动化插件的组合。 “网关”只是我用来表达将我们的代码执行从一个域传递到另一个域的现象的表达式,这些是我们自动化中的地方,我们可以从中看到我们的代码开始在另一个域上执行(这是示例我给了 OnTime 功能) 【参考方案1】:

我认为这可以解决您的问题:

http://ingebrigtsen.info/2007/05/18/cross-appdomain-singleton/

以及对上述帖子的更新:

http://web.archive.org/web/20120427003305/http://www.dolittle.com/blogs/einar/archive/2007/05/30/crossappdomainsingleton-update.aspx

【讨论】:

请查看 cmets 了解详细信息,我们找到了一种不会在两个应用程序域中加载我们的代码两次的方法(这就是问题更新应该说的)。我会接受的解决方案是阻止我们的代码被加载,因为如果我们从第三方域运行,拥有一个实例对我们没有帮助(出于某种原因,我们遇到了同步上下文问题)。如果我错了,请纠正我,但我认为这个答案不会首先阻止代码被加载到其他应用程序域。

以上是关于防止代码被加载到另一个 AppDomain的主要内容,如果未能解决你的问题,请参考以下文章

网站被黑 搜索快照被劫持跳转到另一网站

导航时如何防止div重新加载

JavaScript / DOM:如果焦点丢失到另一个窗口(应用程序),如何防止模糊事件

使用导航从一个片段导航到另一个片段后,防止后按工作

如果启用了无限滚动,如何防止剑道网格两次加载数据?

如何防止 vue-slick-carousel 中的幻灯片更改(导航到另一张幻灯片)?