Autor Beitrag
Xcalibur
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 37



BeitragVerfasst: Mi 26.01.11 15:33 
Hallo,

Um eine DLL zu nutzen habe ich sie einfach im VisualStudio unter Verweise hinzugefügt und dann mit
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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.
dranaxum.wordpress.c...-a-plug-in-system-c/
www.codeproject.com/...assInvokeMethod.aspx
community.bartdesmet.../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) anschauen (falls du mindestens .NET 3.5 verwendest).
Xcalibur Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 37



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.