Frage zu managed DLLs



  • Ist es mit C# und managed DLLs möglich eine DLL in mein Programm einzubinden, deren Pfad sich erst im Programmablauf ergibt. Das Hauptprogramm sollte dannach in der Lage sein eine Funktion in dieser DLL aufzurufen, die ein bestimmtes Objekt zurück gibt. Es sollte nämlich möglich sein verschiedene DLLs auszuwählen, die dann jeweils eine andere Ableitung einer bestimmten Klasse zurückgeben.

    z.B:

    Basisklasse:

    class A
    {
       public void getValue(int v1, v2){return 0;}
    }
    

    Ableitung in einer DLL:

    class B : A
    {
       public override void getValue(int v1, v2){return v1*v2;}
    }
    

    Ableitung in einer anderen DLL:

    class C : A
    {
       public override void getValue(int v1, v2){return v1+v2;}
    }
    


  • unknown User schrieb:

    Ist es mit C# und managed DLLs möglich eine DLL in mein Programm einzubinden, deren Pfad sich erst im Programmablauf ergibt. Das Hauptprogramm sollte dannach in der Lage sein eine Funktion in dieser DLL aufzurufen, die ein bestimmtes Objekt zurück gibt. Es sollte nämlich möglich sein verschiedene DLLs auszuwählen, die dann jeweils eine andere Ableitung einer bestimmten Klasse zurückgeben.

    z.B:

    Basisklasse:

    class A
    {
       public void getValue(int v1, v2){return 0;}
    }
    

    Ableitung in einer DLL:

    class B : A
    {
       public override void getValue(int v1, v2){return v1*v2;}
    }
    

    Ableitung in einer anderen DLL:

    class C : A
    {
       public override void getValue(int v1, v2){return v1+v2;}
    }
    

    Prinzipiell is es möglich eine assembly zur laufzeit zu laden. Es gibt aber einige dinge die dir bewusst sein müssen.
    Ein .NET Prozess kann aus mehreren quasi Subprozessen (AppDomains) bestehen die wiederum 3 Kontexte (binding contexts) haben in die du deine DLLs laden kannst.
    Die binding contexts sind: Load, LoadFrom und Neither.
    Nur im Neither context kannst du mehrere versionen der selben Assembly laden. Bei allen anderen geht das nur wenn du vorher eine AppDomain aufziehst und darin deine DLL lädts. (AppDomains sind isolierte bereiche, also müsstest du remoting verwenden, oder irgendein anderes IPC medium)
    Das Problem mit dem Neither context is jedoch das du die abhängigkeiten (also die einzelnen laufzeitbibliotheken) selbst traversieren und laden musst.

    Wenn du eine DLL nur einmal laden willst, dann reicht es aus in der default AppDomain deine assembly zu laden (Assembly.Load), und z.b. über reflection deine klassen zu erfahren.

    WX




Anmelden zum Antworten