如何在新的 AppDomain 中运行 WPF 应用程序?ExecuteAssembly 失败 [英] How can I run a WPF application in a new AppDomain? ExecuteAssembly fails

查看:23
本文介绍了如何在新的 AppDomain 中运行 WPF 应用程序?ExecuteAssembly 失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用应用程序域从控制台应用程序启动 WPF 应用程序,但是当我这样做时,我收到了意外错误.

I'm trying to launch a WPF application from a Console application, using Application Domains, but when I do, I receive unexpected errors.

独立运行 WPF 应用程序是可行的.

Running the WPF application standalone, works.

此代码也有效:

var baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
var path = string.Format("{0}AddressbookDesktop.exe", baseDirectory);
var processInfo = new ProcessStartInfo(path, "");
Process.Start(processInfo);    

但是此代码失败并出现以下错误.错误似乎在构造函数中,该构造函数为空:

But this code fails with the error below. The error appears to be in the constructor, which is empty:

var addressbookDomain = AppDomain.CreateDomain("addressbookDomain");
addressbookDomain.ExecuteAssembly("AddressbookDesktop.exe");

堆栈跟踪:

System.Windows.Markup.XamlParseException: Cannot create instance of 
'AddressbookMainWindow' defined in assembly 'AddressbookDesktop, Version=1.0.0.0, 
Culture=neutral, PublicKeyToken=null'. Exception has been thrown
by the target of an invocation. Error in markup file 'AddressbookMainWindow.xaml' Line     1 Position 9.
---> System.Reflection.TargetInvocationException: Exception has been thrown by the
target of an invocation. ---> System.InvalidOperationException: The calling thread must 
be STA, because many UI components require this.

at System.Windows.Input.InputManager..ctor()
at System.Windows.Input.InputManager.GetCurrentInputManagerImpl()
at System.Windows.Input.InputManager.get_Current()
at System.Windows.Input.KeyboardNavigation..ctor()
at System.Windows.FrameworkElement.FrameworkServices..ctor()
at System.Windows.FrameworkElement.EnsureFrameworkServices()
at System.Windows.FrameworkElement..ctor()
at System.Windows.Controls.Control..ctor()
at System.Windows.Controls.ContentControl..ctor()
at System.Windows.Window..ctor()
at XX.YY.AddressbookDesktop.AddressbookMainWindow..ctor() in      C:\.....\AddressBookDesktop\AddressbookMainWindow.xaml.cs:line 15
--- End of inner exception stack trace ---

我想我做错了什么,但不明白是什么.感谢您的帮助.

I guess I'm doing something wrong, but can't understand what it is. Thanks for any help.

推荐答案

问题是 WPF 必须从 STA 线程运行(上述内部异常之一说明了这一点).我通过将 STAThreadAttribute 添加到我的 Main() 方法:

The problem is that WPF must be run from a STA thread (one of the inner exceptions above states this). I got this to work by adding the STAThreadAttribute to my Main() method:

using System;

class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        Console.WriteLine("Starting WpfApplication1.exe...");

        var domain = AppDomain.CreateDomain("WpfApplication1Domain");
        try
        {
            domain.ExecuteAssembly("WpfApplication1.exe");
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
        finally
        {
            AppDomain.Unload(domain);
        }

        Console.WriteLine("WpfApplication1.exe exited, exiting now.");
    }
}

这篇关于如何在新的 AppDomain 中运行 WPF 应用程序?ExecuteAssembly 失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆