none
PlugIn ohne Codeänderung RRS feed

  • 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"));
            }
        }
    }
    

    Dienstag, 5. Februar 2013 19:57

Antworten

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
    Dienstag, 5. Februar 2013 22:06
  • 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
    Mittwoch, 6. Februar 2013 11:36
  • MEF ist ein gutes Framework, das man für Plugin-artige Anwendungen verwenden kann. Allerdings sind hierbei Änderungen im Code nötig.
    Mittwoch, 6. Februar 2013 12:26
  • 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

    Mittwoch, 6. Februar 2013 20:41
  • 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

    Donnerstag, 7. Februar 2013 00:55
  • 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

    Donnerstag, 7. Februar 2013 05:30
  • 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
    Donnerstag, 7. Februar 2013 07:59
  • 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

    Donnerstag, 7. Februar 2013 20:15
  • 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

    Donnerstag, 7. Februar 2013 23:52
  • 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.

    Freitag, 8. Februar 2013 18:24
  • 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

    Freitag, 8. Februar 2013 18:31
    Moderator
  • 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

    Freitag, 8. Februar 2013 20:06