在一个 UI 线程上跨多个 AppDomain 运行 WPF 有哪些问题?

问题描述 投票:0回答:2

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

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

wpf .net-3.5 appdomain maf system.addin
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 之间发送

FrameworkElement
(它们不是
MarshalByRefObject
),但您可以使用
FrameworkElementAdapters.ViewToContractAdapter()
ContractAdapterToView()
方法来解决此限制。有关更多详细信息,请参阅 FrameworkElementAdapters MSDN 页面。

然后,一旦你做到了这一点,恕我直言,最大的问题是你不能在“远程”域的

FrameworkElement
之上放置任何东西(经典的“空域问题”)。有关此的更多信息,请参阅此线程


0
投票

我回答了一个类似的问题here并为WPF编辑了它,您可以使用合成引擎如何操作的一个有趣的属性将调度程序泵尾部涂到渲染上下文之一中。 这是一个非常轻量的选择。

另外,我猜您了解 企业库unity

有一个 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 包/绝对语法,但我从未发现它更直观。

© www.soinside.com 2019 - 2024. All rights reserved.