2009-07-06 8 views
11

Dies ist eine Erweiterung einer Frage, die ich zuvor here gestellt habe.Anzeigen eines Formulars aus einer dynamisch geladenen DLL

Lange Rede kurzer Sinn, ich eine DLL dynamisch laden und ein type aus ihn mit dem folgenden Code ein:

Assembly assembly = Assembly.LoadFile("C:\\test.dll"); 
Type type = assembly.GetType("test.dllTest"); 
Activator.CreateInstance(type); 

Von dort aus kann ich type verwende praktisch alles, was in der dllTest Klasse zu verweisen. Die Klasse sollte beim Ausführen standardmäßig ein Formular aufrufen (in diesem Fall ziemlich leer, also nicht komplex).

Ich habe das Gefühl, dass mir hier eine Schlüsselzeile fehlt, die das Formular vor dem Laden auf dem Bildschirm bewahrt.

dllTest.cs (innerhalb der DLL) besteht aus:

namespace test 
{ 
    public partial class dllTest : Form 
    { 
     public dllTest() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

InitializeComponent() setzt das Layout des Formulars auf, die viel zu lange ist hier einzufügen und sollte keinen Unterschied machen.

Irgendwelche Ideen?

+0

Dies ist keine direkte Antwort auf Ihre Frage, aber wenn Sie eine Menge davon tun möchten, können Sie den Composite Application Block (CAB) ausprobieren. Sein Teil der Smart Client Software Factory und kann hier gefunden werden: http://msdn.microsoft.com/en-us/library/aa480482.aspx – blu

Antwort

14

Sie haben etwas mit der Form zu tun, die Sie gerade erstellt haben:

Assembly assembly = Assembly.LoadFile("C:\\test.dll"); 
Type type = assembly.GetType("test.dllTest"); 
Form form = (Form)Activator.CreateInstance(type); 
form.ShowDialog(); // Or Application.Run(form) 
+1

lol ich denke, die Lösung ist offensichtlich! –

+1

Danke - hat perfekt funktioniert. – scrot

3

Ja, Sie sind nicht wirklich keinen Code Angabe außerhalb des Klasseninitialisierer zu laufen. Zum Beispiel muss man sie bei Formularen zeigen.

Sie Ihren Code auf die folgende ändern könnte ...

Assembly assembly = Assembly.LoadFile("C:\\test.dll"); 
Type type = assembly.GetType("test.dllTest"); 
Form form = Activator.CreateInstance(type) as Form; 
form.ShowDialog(); 
+1

Wenn ich zwei Antworten richtig markieren könnte, würde ich. Vielen Dank. – scrot

+0

Kein Problem. –

0

Ich würde mit:

Assembly assembly = Assembly.LoadFile("C:\\test.dll"); 
Type type = assembly.GetType("test.dllTest"); 
object obj = Activator.CreateInstance(type); 
Form form = obj as Form; 
if (form != null) 
    form.Show(); //or ShowDilaog() whichever is needed 

Andere Fehlerprüfung/Handhabung hinzugefügt werden sollte; Zumindest würde ich sicherstellen, dass die Konvertierung funktioniert.

+0

Wenn Sie nur die Null-Überprüfung durchführen möchten, die zusätzliche Objektreferenz nicht benötigt wird, können Sie Obj loswerden und die As-Umwandlung direkt in der Erstellungsinstanz ausführen. –

+0

Je nachdem, was Ihr Plan im Falle eines Fehlers ist, können Sie das sicherlich tun und eine Codezeile beseitigen. Aber wenn die Prüfung fehlschlägt, planen Sie, etwas anderes mit dem Objekt zu versuchen, dann muss es in getrennten Zeilen erfolgen. –

+0

Einverstanden, aber im zweiten Fall denke ich, dass Sie eher eine pragmatische Vorgehensweise als eine optimistische Form und dann einen ausfallsicheren Schalter inline delegieren würden. –

1

Wenn eine Klasse zu Form gehört, gibt Assembly.GetType()NULL zurück. Wenn eine Klasse zu gehört dann kann ich sehen, dass der Typ zurückgegeben wird.

Auch sollte die Syntax als:

Type type = assembly.GetType("Assemblytest.clsTest"); 

wo

  • clsTest der Name der Klasse (eine Benutzersteuerung) ohne die
  • Assemblytest ist der Name des Montags sein. dll Erweiterung.
Verwandte Themen