Benutzer mit den meisten Antworten
PlugIn ohne Codeänderung

Frage
-
Hallo,
ich habe ein App.EXE.
Diese hat in Ihrem bin\Release Ordner eine
Connection_A.DLL, die mein Interface implementiert.
Connection_B.DLL, die mein Interface implementiert.
Connection_C.DLL, die mein Interface implementiert.
Im Code müsste ich von jedem Typ Objekte anlegen.
Also
private ConnectorMyData_A MDataA;
private ConnectorMyData_B MDataB;
private ConnectorMyData_C MDataC;
Was ich will.
Ich finde eine DLL die das Interface hat und gut ist es.
Dann müsste ich neutral ein Objekt erzeugen.
Wie macht man das?
Ich rufe ja nur jede Funktion über die Schnittstellenfunktion auf.Grüße Andy
namespace MYTestApp { public partial class Form1 : Form { private IMyTest IMyInterface; private ConnectorMyData MData; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { MData = new ConnectorMyData(); IMyInterface = MData; cbVariable.SelectedIndex = 0; } private void button1_Click(object sender, EventArgs e) { MessageBox.Show(IMyInterface.Get(4, "No")); } } }
Antworten
-
Hallo Andy,
das Stichwort dazu lautet MEF (Managed Extensibility Framework) und ist seit .NET Framework 4 standardmäßig mit dabei. Infos dazu findest du hier:
http://msdn.microsoft.com/de-de/library/vstudio/dd460648.aspx
und hier eine ganz ausgezeichnete Einführung:
http://stefanhenneken.wordpress.com/2011/05/22/mef-teil-1-grundlagen-imports-und-exports/
Viele Grüße
Jens Brand- Als Antwort markiert Andy Bauer Mittwoch, 6. Februar 2013 20:38
-
Hi,
das machst du am besten über Reflections (http://msdn.microsoft.com/en-us/library/f7ykdhsy.aspx, http://msdn.microsoft.com/en-us/library/system.reflection.aspx). Hierbei lädst du alle DLLs/Assemblies aus einem Verzeichnis und gehst durch alle Typen, die darin enthalten sind. Für jeden Typ prüfst du, ob sie dein Interface implemtiert. Ist dies der Fall hast du ein PlugIn gefunden und kannst wieder über Reflections eine Instanz erzeugen. Alle erzeugten Instanzen kannst du dann in deiner Anwendung weiterverwenden, indem du die Interface Methoden verwendest. Hier ist ein Beispiel dazu http://code.msdn.microsoft.com/Creating-a-simple-plugin-b6174b62.
Grüße
Chris
- Bearbeitet chriga Dienstag, 5. Februar 2013 22:19
- Als Antwort markiert Andy Bauer Mittwoch, 6. Februar 2013 20:39
Alle Antworten
-
Hi,
das machst du am besten über Reflections (http://msdn.microsoft.com/en-us/library/f7ykdhsy.aspx, http://msdn.microsoft.com/en-us/library/system.reflection.aspx). Hierbei lädst du alle DLLs/Assemblies aus einem Verzeichnis und gehst durch alle Typen, die darin enthalten sind. Für jeden Typ prüfst du, ob sie dein Interface implemtiert. Ist dies der Fall hast du ein PlugIn gefunden und kannst wieder über Reflections eine Instanz erzeugen. Alle erzeugten Instanzen kannst du dann in deiner Anwendung weiterverwenden, indem du die Interface Methoden verwendest. Hier ist ein Beispiel dazu http://code.msdn.microsoft.com/Creating-a-simple-plugin-b6174b62.
Grüße
Chris
- Bearbeitet chriga Dienstag, 5. Februar 2013 22:19
- Als Antwort markiert Andy Bauer Mittwoch, 6. Februar 2013 20:39
-
Hallo Andy,
das Stichwort dazu lautet MEF (Managed Extensibility Framework) und ist seit .NET Framework 4 standardmäßig mit dabei. Infos dazu findest du hier:
http://msdn.microsoft.com/de-de/library/vstudio/dd460648.aspx
und hier eine ganz ausgezeichnete Einführung:
http://stefanhenneken.wordpress.com/2011/05/22/mef-teil-1-grundlagen-imports-und-exports/
Viele Grüße
Jens Brand- Als Antwort markiert Andy Bauer Mittwoch, 6. Februar 2013 20:38
-
MEF ist ein gutes Framework, das man für Plugin-artige Anwendungen verwenden kann. Allerdings sind hierbei Änderungen im Code nötig.
Hallo Zusammen,
Frage beantwortet, es funktioniert.
D.h. ich kann verschiedene Varianten mit der gleichen Exe verarbeiten.string name = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
ICollection<ITrXne> plugins = GenericPluginLoader<ITrXne>.LoadPlugins(name + @"\..\..\..\PlugIns\");Ich lege nun ein Verzeichnis für die PlugIns an. Besteht die Möglichkeit, das Solutionverzeichnis
heraus zu bekommen?Abschließend evtl. noch wann empfiehlt es sich konkret MEF zu verwenden?
Vielleicht kennst Du auch ein gutes, verständliches Beispiel.
Wenn ja wäre es nett, es zu nennen.Danke vorab.
Viele Grüße Andy
-
Hallo Andy,
was genau meinst du mit "das Solutionverzeichnis heraus bekommen"?
In den Links von Jens sind gute Beispiele zu MEF. Du kannst aber auch noch hier reinschauen http://code.msdn.microsoft.com/Creating-a-simple-plugin-b45f1d4e.
Wann man MEF verwendet hängt von persönlichen Vorlieben ab. Möchte man was standardisiertes, das von Microsoft zur Verfügung gestellt wird, schon einige Funktionen bietet, sich mit Reflections nicht auseinandersetzen und man den Einarbeitungsaufwand nicht scheut, ist man mit MEF gut bedient. Es gibt aber auch andere, teils mächtigere, Alternativen dazu.
Möchte man die volle Kontrolle behalten, möglichst wenig Overhead haben, die Grundlagen kennenlernen und hat Spaß bei der Entwicklung eigener kleiner Frameworks, bietet sich eine eigene Implementierung an.
Viele Grüße
Chris
-
was genau meinst du mit "das Solutionverzeichnis heraus bekommen"?
Hallo Chris,
Es ist ja so.
Solution
PlugIns
PlugTest1
bin
Release
TestApp
bin
Release
Dann dachte ich eben alles ins PlugIns kopieren und da suchen, wegen der Übersicht.
Grüße Andy
-
Hallo Andy,
das macht nur solange Sinn, wie du die Anwendung nicht auslieferst. Die Auslieferung enthält ja in der Regel nur den Inhalt des Release Ordners. Daher ist ein Plugin Ordner unter Release eher das Ausschlaggebende.
In der Entwicklung kannst du aber unter deinem Projekt ein Plugin Ordner anlegen, in welchen du deine Plugin DLLs verlinken kannst. Diese Struktur kann dann in den Release-Ordner übernommen werden.
Viele Grüße
Chris
- Bearbeitet chriga Donnerstag, 7. Februar 2013 08:00
-
das macht nur solange Sinn, wie du die Anwendung nicht auslieferst. Die Auslieferung enthält ja in der Regel nur den Inhalt des Release Ordners. Daher ist ein Plugin Ordner unter Release eher das Ausschlaggebende.
Hallo,
Danke.
Kennst Du Dich noch mit METAdaten aus?
Wann sinnvoll, wie am besten abfragen. OK mit Lazy, ja,
aber evtl. hast Du ein Beispiel mit WinForms und PlugIns.
Grüße Andy
-
Hi,
hier sind noch mehr Infos über Metadaten:
http://stefanhenneken.wordpress.com/2011/06/05/mef-teil-2-metadaten-und-erstellungsrichtlinien/
Ich würde hier nähere Informationen über das Plugin hinterlegen. Diese können genutzt werden, um das richtige Plugin zu finden und zu laden. Evtl. gibt es auch andere Anwendungsgebiete.
Eigentlich unterscheidet sich das Vorgehen bei WinFroms und WPF mit MEF nicht wesentlich. Aber hier ist ein Beispiel mit WinForms http://www.codeproject.com/Articles/258681/Windows-Forms-Modular-App-using-MEF
Grüße
Chris
-
Hallo Chris,
hast Du für mich noch einen Tipp.
Ich habe keinen SQL Server und möchte die Datenbankdatei nur
Standalone öffnen.
Data Source=.\SQLEXPRESS;AttachDbFilename="C:\Documents and Settings\bauer\My Documents\Downloads\_B\dbOrdersSample.mdf";
Integrated Security=True;ConnectTimeout=30;User Instance=True
Was kann ich tun?
Grüße Andy
HS Osnabrück MEF Einführung
http://www.edvsz.hs-osnabrueck.de/fileadmin/user/huelsmann/05_MEF_Anleitung.pdf
Ist nicht schlecht, in dem Stil sollte es mehr geben. Vielleicht kennst Du noch Tutorials von anderen Unis, Hochschulen.
---------------------------
Microsoft Visual Studio
---------------------------
Netzwerkbezogener oder instanzspezifischer Fehler beim Herstellen einer Verbindung mit SQL Server. Der Server wurde
nicht gefunden, oder auf ihn kann nicht zugegriffen werden. Überprüfen Sie, ob der Instanzname richtig ist und ob
SQL Server Remoteverbindungenzulässt. (provider: SQL NetworkInterfaces, error: 26 - Fehler beim Bestimmen des
angegebenen Servers/der angegebenen Instanz)
---------------------------
OK
Teils sind halt die Beispiele ziemlich komplex.
http://www.screencast.com/users/Questpond/folders/Default/media/3ea5f370-cec9-4087-8a41-622cdce424bf
-
Hallo Andy,
Du kannst keine SQL Server Datenbank "Standalone" öffnen, ohne einen installierten SQL Server (Express) zu haben.
D.h. SQL Server (Express) muss immer installiert sein, damit Du das machen kannst.
So oder so sind Benutzerinstanzen in der Regel nicht sinnvoll einzusetzen. Bei Webanwendungen (ASP.NET) oder bei Anwendungen, die später woanders laufen sollen als auf dem eigenen Rechner geht es überhaupt nicht, da die Voraussetzungen hierfür so gut wie nie gegeben sind.
Daher solltest Du die mdf Datei ganz normal in die SQL Server Instanz bringen (Datenbank anhängen) und dann klappt das auch.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Du kannst keine SQL Server Datenbank "Standalone" öffnen, ohne einen installierten SQL Server (Express) zu haben.
D.h. SQL Server (Express) muss immer installiert sein, damit Du das machen kannst.
Hallo Stefan,
ja ok, wenn es anders wirklich nicht geht. Ich will die Datei ja vom Modell her nicht ändern.
Wenn es mal dann zum Kunde geht, was muss da dann mind. drauf?
Damit die Anwendung geht.
Grüße Andy