Entwickler-Ecke

Basistechnologien - Assembly Verweis und using namespace zur Laufzeit?


Xcalibur - Mi 26.01.11 15:33
Titel: Assembly Verweis und using namespace zur Laufzeit?
Hallo,

Um eine DLL zu nutzen habe ich sie einfach im VisualStudio unter Verweise hinzugefügt und dann mit

C#-Quelltext
1:
using derbestimmteNamespace;                    

konnte ich alle Methoden usw dieses Namespaces nutzen.

Nun habe ich verschiedene DLL's und würde gerne erst zur Laufzeit entscheiden welche ich nutzen möchte.
Kann ich den oben genannten Schritt einfach dynamisch machen, (also das ich DLL laden kann ist mir klar aber kann ich dann auch so einfach einen ganzen Namespace aus dieser DLL nutzen oder muss ich jede einzelne Methode extra definiern.

Ich hoffe der Text da oben macht halbwegs Sinn.

Gruß Gernot


Th69 - Mi 26.01.11 16:55

Hallo Gernot,

das dynamische Laden von Assemblies (DLLs) ist leider nicht ganz so elegant.
Die entscheidende Methode dafür ist Assembly.Load und dann mußt du aber die einzelnen Methoden per Invoke() aufrufen, s.z.B.
http://dranaxum.wordpress.com/2008/02/25/dynamic-load-net-dll-files-creating-a-plug-in-system-c/
http://www.codeproject.com/KB/cs/DynLoadClassInvokeMethod.aspx
http://community.bartdesmet.net/blogs/bart/archive/2004/11/26/475.aspx

Für ein echtes Plugin-System lohnt sich der Aufwand.
Wenn du jedoch nur wenige verschiedene DLLs hast, dann würde ich einfach eine Batch-Datei anbieten, welche die entsprechende DLL umbenennt und dann die Anwendung startet.
Da du jedoch "zur Laufzeit" geschrieben hast, wird das also etwas komplizierter - evtl. beschreibe dein System mal etwas detailierter.

Für ein echtes Plugin-System solltest du dir unbedingt mal Managed Extensibility Framework (MEF) [http://mef.codeplex.com/] anschauen (falls du mindestens .NET 3.5 verwendest).


Xcalibur - Mi 26.01.11 17:17

Danke für die schnelle Antwort.

Im Prinzip geht es darum dass ich nur eine Klasse entwickeln möchte, welche ich dann in anderen Projekte einbauen will.
In den Folgeprojekten nutze ich die Klasse dann für verschiedene Zugriffe auf DB-Systeme. Je nachdem welche DB ich verwende soll
die Klasse die entsprechende DLL laden und die Methoden verwenden.

Jedoch kann ich die DLL's nicht fix mitgeben also soll zur Laufzeit geprüft werden ob die entsprechende DLL auf dem PC drauf ist, und dann erst laden oder eben eine Fehler ausgeben.

Gruß Gernot


Ralf Jansen - Mi 26.01.11 18:15

Zitat:
Im Prinzip geht es darum dass ich nur eine Klasse entwickeln möchte, welche ich dann in anderen Projekte einbauen will.
In den Folgeprojekten nutze ich die Klasse dann für verschiedene Zugriffe auf DB-Systeme. Je nachdem welche DB ich verwende soll
die Klasse die entsprechende DLL laden und die Methoden verwenden.


Programmiere einfach gegen ein Interface nicht gegen eine konkrete Klasse. Denk dir also ein gemeinsames Interface aus programmiere deinen allgemeinen Code dagegen und lasse deine dynamisch zu ladenden Klassen dieses Interface implementieren. Wenn du dann zur Laufzeit eine konkrete Klasse brauchst lade die entsprechende Assembly dynamisch(wie von user profile iconTh69 angesprochen), klaube dir die entsprechende Klasse die du brauchst aus der Assembly und caste diese Klasse auf das Interface gegen das du in deiner Anwendung programmiert hast und benutze diese dann typsicher.