Quasi-Treiber DLL dynamisch zur Laufzeit einbinden



  • Ich bin schwer eingerostet was C# angeht und bitte das im voraus zu entschuldigen.

    Ich habe vorher noch nie mit DLLs gearbeitet bin also noch recht unbeholfen und habe bisher nur die statische variante per DLLImport gefunden, brauche aber eine andere Möglichkeit oder einen Hinweis wie ich es damit lösen könnte.

    Ich hab eine Basisklasse in einer DLL geschaffen, welche virtuelle Funktionen und eine Loadfunktion beinhaltet.

    Diese Loadfunktion soll einen andere DLL laden, welche von der Basisklasse abgeleitet wurde und die Funktionen implementiert und somit auch das steuert was ich steuern möchte! Diese Loadfunktion hat als Parameter den Pfad zu der DLL.

    Bei der statischen Variante müsste ich schon zur Compilezeit den Namen der DLL festlegen .. faktisch müsste ich die entsprechend umbenannte ableitende Klasse nur an den Ort verschieben wo die Basisklasse sie erwartet und dann das Objekt erzeugen soweit ich verstanden habe. Kann ich das irgendwie zu meinem Vorteil nutzen oder gibt es vielleicht noch eine elegantere Lösung, bei der ich über soetwas wie Loadlibrary gehe!? Die verwendeten Funktionen sind immer dieselben (der Vererbung wegen) nur die interne Funktion ist halt anders!

    Ich hoffe ich konnte mein Problem verständlich erklären.



  • Was sind denn das für Librarys? C# Libs oder C++ Libs?



  • beide sind C# .NET 2.0

    eine DLL mit der Basisklasse und der Loadfunktion
    und eine DLL mit der abgeleiteten Klasse die von der Loadfunktion der Basisklasse geladen werden soll

    am Ende soll das ganze über Labview ansprechbar sein, jedoch unter der Vorraussetzung dass es dynamisch machbar ist (Gerät zur Laufzeit tauschen und neuen Treiber laden)

    über .NET kannn man die DLL zwar komfortabel einbinden, jedoch ist da nix mit dynamisch, LV sperrt sich schonn, wenn man nur die Versionsnummer ändert, weswegen ich eine Basisklasse brauche, die ich im Idealfall nie wieder neu übersetzen muss!





  • ei schau da! danke das liefert deutlich bessere ergebnisse als meine suchworte ^^

    Vielen Dank!



  • also nachdem ich jetzt erstmal ne kleine Pause machen musste hab cihs mal ausprobiert und stoße auf folgendes Problem

    TestDLL.dll
    [A]TestDLL.DLLClass kann nicht in [B]TestDLL.DLLClass umgewandelt werden. Der Typ "A" stammt von "TestDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" im Kontext "LoadFrom" am Speicherort "TestDLL.dll".. Der Typ "B" stammt von "TestDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" im Kontext "Default" am Speicherort "TestDLL.dll"..

    TestDLL.DLLClass libraryobject = null;
            Assembly DLLLink = null;
            public bool loadDLL(string path)
            {
                try
                {
                    DLLLink = Assembly.LoadFrom(path);
                    Type t = DLLLink.GetType("TestDLL.DLLClass");
                    libraryobject = (TestDLL.DLLClass)Activator.CreateInstance(t); //<---- hier steigt er aus
                    return true;
                }
                catch (Exception e)
                {
                    textBox1.AppendText(e.Message+"\r\n");
                }
                return false;
            }
    

    defakto unterschiedet sich nur der "Kontext", kann ich das irgendwie beheben !?

    Der Fehler kommt auch wenn ich die Instanz als object nehme und on demand auf TestDLL.DLLClass caste!


Anmelden zum Antworten