4

我们正在考虑创建一个跨多个 AppDomain 运行的 WPF UI。其中一个应用程序域将运行应用程序,而其余的 AppDomains 将托管一系列用户控件和逻辑。当然,这个想法是将这些用户控件和逻辑从主应用程序中分离出来。

是使用 MAF/System.AddIn 执行此操作的示例。其他人在这方面有什么经验?此解决方案如何处理可能发生在一个用户控件内的 RoutedEvents/Commands,以及这些是否在 AppDomains 中正确序列化?WPF 资源呢?可以跨 AppDomain 无缝访问它们吗?

4

2 回答 2

2

老问题,但尽管如此:您将需要有多个 UI 线程 - 每个 AppDomain 一个。像这样创建它们:

        var thread = new Thread(() =>
        {
            var app = new Application();
            app.Run();
        });
        thread.Name = AppDomain.CurrentDomain.FriendlyName;
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();

最大的挑战是您无法在 AppDomain 之间发送 FrameworkElements(它们不是 MarshalByRefObject),但您可以使用 FrameworkElementAdapters.ViewToContractAdapter() 和 ContractAdapterToView() 方法来解决此限制。有关更多详细信息,请参阅FrameworkElementAdapters MSDN 页面。

然后,一旦你有了这个,最大的问题恕我直言,你不能在“远程”域的 FrameworkElement 上放置任何东西(经典的“空域问题”)。有关这方面的更多信息,请参阅此线程。

于 2013-04-16T11:59:33.180 回答
0

我在这里回答了一个类似的问题,并为 WPF 编辑了它,您可以使用一个有趣的属性来了解 Compisition 引擎如何操作,将调度程序 Pump 拖尾到一个渲染上下文中。这是一个非常轻量级的选择。

另外,我猜你知道企业图书馆统一

有一个WPF 应用程序块,所以使用该模式并不太痛苦;)但他们不是说,没有痛苦就没有收获吗?

还有 CAB(复合 UI 应用程序块),与统一联系在一起。WPF SDK人员制作了 Silverlight 和 WPF 平台。(又名棱镜)。

哦,对了,你还问资源?我更喜欢在 Application 类中手动加载资源。我已经意识到一件事,假设您在子文件夹中有一个 ResourceDictionary,并且您正在该 ResourceDictionary 中加载 MergedDictionaries。因此,如果在您的 Application 类中,您加载“my-res-dir/MergedDictionaryLoader.xaml”(通过代码或 xaml),则所有未来的 MERGEDDICTIONARIES 加载都从“my-res-dir”加载。

如果你问我有点疯狂,我认为由于进程当前目录没有改变,你应该为所有其他目录指定“my-res-dir/foo.xaml”。然而,事实并非如此(我不相信这至少在任何地方都有很好的记录,应该被认为是一个错误恕我直言)。

所以请记住,WPF 资源字典加载将基于当前XAML所在的目录。因此,您从“my-res-dir/MergedDictionaryLoader.xaml”中指定 Source="foo.xaml"。我什至玩过 URI 包/绝对语法,但我从未发现它更直观。

于 2009-05-29T07:08:20.020 回答