Windows Forms externer Assemblies nutzen

Veröffentlicht: 18. Okt 2005
Von Mathias Schiffer

In Visual Basic 6 war es noch relativ schwierig, Forms aus externen Assemblies einzusetzen. Dieser MSDN Quickie zeigt, wie einfach das mit Visual Basic .NET funktioniert.

Es ist sehr hilfreich, Forms in externen Assemblies unterzubringen und von dort aus zu verwenden, um Anwendungen zu internationalisieren, offen erweiterbar zu gestalten oder schlicht übersichtlich zu pflegen, zu warten und weiter zu entwickeln. Auch andere gute Gründe lassen sich leicht finden. Während dieses Vorgehen unter Visual Basic 6, beispielsweise über Forms in ActiveX-DLLs mit verschiedenen Problemen im Detail behaftet war, stellt sich die Situation in .NET einfacher dar.

Um das folgende Beispiel nachzuvollziehen, starten Sie Visual Studio .NET mit einem Visual Basic .NET- oder Visual C#-Klassenbibliothek-Projekt (standardmäßig "ClassLibrary1"). Fügen Sie dem Projekt eine Form (standardmäßig "Form1") hinzu und versehen Sie diese zur besseren Identifizierung mit einigen beliebigen Steuerelementen. Kompilieren Sie dieses Projekt anschließend. Im weiteren Beispiel gehen wir davon aus, dass die resultierende DLL ClassLibrary1.DLL im Verzeichnis D:\Msdn\ClassLibrary1\obj\debug\ liegt. Passen Sie ggf. Pfad- und Dateinamen aus dem Beispiel an Ihre Pfade/Dateinamen an.

Erzeugen Sie nun ein neues Visual Basic- oder Visual C#-Projekt - der Einfachheit halber ein Windows Forms-Projekt ("Windows-Anwendung"). Mit einem Doppelklick auf die standardmäßig zur Verfügung gestellte Form gelangen Sie in deren Load-Ereignisprozedur. Fügen Sie nun noch eine Importsdirektive für System.Reflection hinzu ("Imports System.Reflection" bzw. "using System.Reflection;") und versehen Sie das Load-Ereignis mit dem folgenden Code

für Visual Basic .NET:

Private Sub Form1_Load(ByVal sender As System.Object, _
                         ByVal e As System.EventArgs _
                         ) Handles MyBase.Load
  
    'Modulimport: "Imports System.Reflection"
  
    ' Die externe Assembly zunächst (hier per Dateipfad) laden:
    Dim externeAssembly As [Assembly] _
                        = [Assembly].LoadFrom( _
                          "D:\Msdn\ClassLibrary1\obj\debug\ClassLibrary1.dll")
  
    ' Modul abholen:
    Dim assemblyModul As [Module] _
                      = externeAssembly.GetModule("ClassLibrary1.dll")
  
    ' Den Typ "Form1" des Moduls abholen (inkl. Namespace-Angabe!):
    Dim typeForm1 As Type = assemblyModul.GetType("ClassLibrary1.Form1")
  
    ' Instanz der Form erzeugen und anzeigen:
    Dim externeForm As Form = DirectCast(Activator.CreateInstance(typeForm1), _
                                         Form)
    externeForm.Show()
  
  End Sub


und für Visual C#:

    private void Form1_Load(object sender, System.EventArgs e)
    {
  
    // Modulimport: "using System.Reflection;"
  
    // Die externe Assembly zunächst (hier per Dateipfad) laden:
    Assembly externeAssembly = Assembly.LoadFrom("D:\\Msdn\\ClassLibrary1\\obj\\debug\\ClassLibrary1.dll");
  
    // Modul abholen:
    Module assemblyModul = externeAssembly.GetModule("ClassLibrary1.dll");
  
    // Den Typ "Form1" des Moduls abholen (inkl. Namespace-Angabe!):
    Type typeForm1 = assemblyModul.GetType("ClassLibrary1.Form1");
  
    // Instanz der Form erzeugen und anzeigen:
    Form externeForm = (Form)Activator.CreateInstance(typeForm1);
    externeForm.Show();
  
    }

Starten Sie dieses Testprojekt, so erscheinen (erwartungsgemäß) beide Forms - die leere Form des Beispielprojekts sowie die mit Steuerelementen versehene Form aus der externen Assembly. Nutzen Sie dieses Testszenario, um auch andere Varianten der Anzeige zu prüfen: So können Sie etwa mithilfe einer ShowDialog-Anzeige der externen Form feststellen, dass auch die modale Anzeige von Forms aus externen Assemblies kein Problem darstellt.

Mathias Schiffer widmet sich als freier Technologievermittler und Entwickler großen Projekten ebenso wie arbeiterleichternden Alltagslösungen. Seit Jahren gibt er sein Wissen und seine Erfahrungen in unzähligen Publikationen und Beratungen auch an andere Entwickler und Entscheider weiter. Sie erreichen Mathias Schiffer per E-Mail an die Adresse Schiffer@mvps.org.


Anzeigen: