2016-11-08 6 views
3

nennen ich für diese Ausnahme zu suchen versucht, aber ich konnte keine Lösung auf meinem FallC# SetCompatibleTextRenderingDefault muss vor dem ersten

Ich bin mit dem Code Im Folgenden eine .NET-Anwendung aufzurufen finden:

 Assembly assem = Assembly.Load(Data); 
     MethodInfo method = assem.EntryPoint;   
     var o = Activator.CreateInstance(method.DeclaringType);    
     method.Invoke(o, null); 

die Anwendung, die aufgerufen wird, hat eine Form und in der Entrypoint der Anwendung:

[STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); //Exception 
     Application.Run(new Form1()); 
    } 

SetCompatibleTextRenderingDefault muss vor dem erstenaufgerufen werdenObjekt wird in der Anwendung erstellt.

EDIT:

 Assembly a = Assembly.Load(Data); 
     MethodInfo method = a.GetType().GetMethod("Start"); 
     var o = Activator.CreateInstance(method.DeclaringType);    
     method.Invoke(o, null); 
+0

Sie können das nicht tun. Sie könnten versuchen, das Formular manuell zu erstellen. – SLaks

+0

Ich habe es nicht verstanden? Kannst du bitte erklären? – Huster

Antwort

5

Sie sollten eine neue Methode erstellen, die die Initialisierung überspringt.

[STAThread] 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); //Exception 
    Run(); 
} 

public static void Run() 
{ 
    Application.Run(new Form1()); 
} 

Und mit der Reflexion für die Run-Methode suchen. Aber die Application.Run wird den aktuellen Thread blockieren. Wenn Sie keine neue Nachrichtenpumpe starten möchten, sollten Sie versuchen, die Form-Klasse mit Reflektion zu suchen.


Update:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); 
     var filename = Path.Combine(path, "WindowsFormsApplication1.exe"); 
     var assembly = Assembly.LoadFile(filename); 
     var programType = assembly.GetTypes().FirstOrDefault(c => c.Name == "Program"); // <-- if you don't know the full namespace and when it is unique. 
     var method = programType.GetMethod("Start", BindingFlags.Public | BindingFlags.Static); 
     method.Invoke(null, new object[] { }); 
    } 
} 

Und die Ladeanordnung:

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Start(); 
    } 


    public static void Start() // <-- must be marked public! 
    { 
     MessageBox.Show("Start"); 
     Application.Run(new Form1()); 
    } 
} 

Das hier funktioniert!

+0

Und mit Reflektion für die Run-Methode suchen? – Huster

+0

Das ist richtig. Das Problem ist, dass die Visual Styles usw. nur zu Beginn der Anwendung als solche bezeichnet werden. Wenn Sie eine Assembly laden (gilt auch für exefile Assemblies), werden sie in die gleiche Appdomain geladen. –

+0

Also muss ich im Grunde den EntryPoint Main() überspringen und Direkt von der Run-Methode erstellen? – Huster

Verwandte Themen