2010-08-05 7 views
7

Ich versuche, eine WPF-Anwendung von einer Konsolenanwendung unter Verwendung der Anwendungsdomänen zu starten, aber wenn ich dies tue, erhalte ich unerwartete Fehler.Wie kann ich eine WPF-Anwendung in einer neuen AppDomain ausführen? ExecuteAssembly schlägt fehl

Die eigenständige WPF-Anwendung wird ausgeführt.

Dieser Code funktioniert auch:

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

Aber dieser Code nicht mit dem Fehler unten. Der Fehler wird in den Konstruktor sein, die leer ist:

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

Stapelüberwachung:

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 --- 

Ich glaube, ich bin etwas falsch zu machen, kann aber nicht verstehen, was es ist. Danke für jede Hilfe.

Antwort

8

Das Problem besteht darin, dass WPF von einem STA-Thread ausgeführt werden muss (eine der inneren Ausnahmen besagt dies). Ich habe dies die STAThreadAttribute meine Main() Methode, indem zu arbeiten:

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."); 
    } 
}