在新的应用程序域中加载 shell 窗口和模块

本文关键字:shell 窗口 模块 加载 应用程序域 | 更新日期: 2023-09-27 18:32:21

我知道,如果你想做一些事情,比如在单独的应用程序域中加载PRISM模块,以便可以加载和卸载它们,那么需要克服巨大的障碍。我正在尝试在新的应用程序域中加载所有内容。这包括 shell 窗口(保存视图区域)、引导程序和模块。

构建了一个示例解决方案,该解决方案模拟了我根据我们尝试转换的当前软件实现此解决方案所需的方式。目前,这包括基本上加载一些设置的 EXE、处理加载应用程序域、加载 shell 窗口和模块发现的核心类和包装器类(核心创建新的应用程序域并将包装器的实例加载到其中,而包装器发现模块并实例化 shell), 最后是外壳本身,负责显示外壳并按需加载模块。

我遇到的问题是,当 Wrapper 类加载到新的应用程序域中时,一切都运行而没有异常,但模块永远不会显示(进一步挖掘表明视图永远不会添加到视图区域,显然是因为视图区域永远不会添加到区域管理器中的区域)。如果我在原始应用程序域中实例化包装器,一切正常。

我试图弄清楚为什么会发生这种情况以及是否有解决方法。我知道这个过程看起来很复杂,但出于各种不同的原因,这就是我们正在追求的方法。关于为什么我在视图区域和应用程序域方面遇到问题的任何帮助将不胜感激。以下是解决方案的链接:https://gist.github.com/fb8f989f42ceb3f4ee56.git

在新的应用程序域中加载 shell 窗口和模块

首先,看起来我的这个问题的代码在 Git 上不再存在。我确实有一个示例解决方案,如果有人需要,我可以分享。

问题源于这样一个事实,即从未创建指定为视图区域的依赖对象。在区域管理器内部,检查 DependecyObject 以查看它是否处于设计模式,这会导致 CreateRegion 在返回 true 时不被调用。这是另一个问题,他的答案有助于解释问题及其解决方法。

如何在 ElementHost 中使用 Prisim