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

我们正在寻找创建跨多个AppDomain运行的
WPF UI.其中一个应用程序域将运行该应用程序,而剩余的AppDomain将承载一系列用户控件和逻辑.当然,这个想法是将这些用户控件和逻辑远离主应用程序.

Here是使用MAF / System.AddIn执行此操作的示例.其他人对此有哪些经验?此解决方案如何处理可能在一个用户控件内部发生的RoutedEvents / Commands,并在AppDomains中正确地序列化? WPF资源怎么样?可以通过AppDomains无缝访问它们吗?

最佳答案 老问题,但是:你需要有多个UI线程 – 每个AppDomain一个.像这样创建它们:

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

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

然后,一旦你有了这个,最大的问题恕我直言,你不能在“远程”域(经典的“空域问题”)的FrameworkElement之上放置任何东西.有关详细信息,请参阅this thread.

点赞