NET-Komponenten in native Programme einbinden



  • Tach auch,

    ich würde gerne in meinem C++ Programm die Möglichkeit einbauen, verschiedene Komponenten, die die CLR (Common Language Runtime) benötigen einzubinden.

    Java-Klassen kann ich bereits schon einbinden, indem ich zunächst die VRE ("Virtual Runtime Environment" = "CLR" für Java) in Form einer DLL lade und dann einiger Funktionen in der DLL die Java-Klasse lade und darin eine Methode aufrufe.

    Nun hätte ich auch gerne eine solche DLL für die CLR, um .NET Programme / Bibliotheken zu verwenden. (Mein Programm soll nämlich auf jeden Fall nativ bleiben!) Gibt es sowas nicht? Habe schon viel gesucht und nichts gefunden, nur eine ähnliche Sache zum ROTOR-Projekt, aber das lässt sich wohl nicht auf das jetzige NET Framework übertragen...

    Hat da jemand eine Idee, oder weiss jemand zumindestens ob das Grundsätzlich geht ? (Oder bietet M$ so eine separate DLL extra nicht an, damit man auch schön sein C++ Programm direkt in NET-Code übersetzt?)

    Vielen Dank,

    Wischmop



  • Stichwort: RCW ( Runtime callable wrapper )



  • Wo liegt eigentlich genau dein Problem ( wegen Äußerung im anderen Thread )???



  • Ich stelle mir das so vor, dass eine Partnerfirma von uns, uns diverse Komponenten als NET-Code zur Verfügung stellt und wir diese dann in unser Programm einbinden. Auf eine separate Middleware wollen wir aber verzichten, denn dann hat man das Problem, dass Kunde A diese Middleware bevorzugt und Kunde B eine andere,... soll quasi alles aus einem Guss sein. (bzw. so aussehen!)

    Eine andere Partnerfirma entwickelt bereits mit Java. Solche class-Dateien in unser natives Programm einzubinden ist kein Problem. Dafür lade ich unter Windows die jvm.dll, unter Linux die libjava.so (oder war's libjvm.so???), rufe dort diverse Funktionen auf, mit denen ich als erstes eine JVM-Instanz erstelle, und anschliessend über diese Instanz und den in der Lib. enthaltenen JNI-Funktionen, Methoden aus der Class-Datei aufrufe, etc.

    So etwas würde ich halt nun gerne auch mit NET-Code machen.
    Mein Problem ist nun, dass ich nicht weiss wie! Zu JNI gibt's haufenweise Dokumentation, deshalb läuft das ja auch schon perfekt, aber zu .NET ... Soweit ich weiss (glaube ich schon herausgefunden zu haben), benötige ich die DLL's mscoree.dll oder mscorlib.dll, aber dann hört's bei mir schon auf.

    Kennst Du da nen coolen Link, ein Tutorial oder einen Codeschnipsel?
    Bin da echt für jeden Tip dankbar. Auch wenn ich da in eine falsche Richtung denke, wär's gut zu wissen.

    vielen Dank,
    Wischmop



  • Kurze Zwischenfrage:
    1. .NET-Framework normal installiert ( klingt nämlich irgend wie anders! )
    2. Kann Zugriff auch über COM durchgeführt werden?
    3. Oder muss die .NET DLL Unmanaged Export Methoden anbieten

    P.S: Zu Punkt 3, dies weiß ich nur theoretisch, da ich keine Sprache, außer MSIL selber, kenne die dies Unterstützt!



  • Tja, ehrlich gesagt weiss ich dass noch nicht, was wir für .NET-Code bekommen bzw. was die erzeugen können.

    Aber trotzdem, nur rein Theoretisch und auch wegen allgemeinerem Interesse:

    Zur COM Komponente: Dazu rufe ich doch die Funktion DllGetClassObject (in C / WinAPI) auf, mit der entsprechenden ID der Komponente und erhalte einen Verweis auf die weitere Klassenbeschreibung. Ist das so richtig, oder völlig falsch? Danach weiss ich aber ohnehin nicht weiter, da ich mit COM noch nix gemacht habe! (blamage... 😃 )
    Aber soweit ich das verstanden habe, gibt es dann doch keinen Unterschied zu anderen COM Komponenten, oder? Wenn ja, dann werde ich dazu bestimmt ein paar Tuts finden, oder besser, Du kennst welche 🙂

    Aber zum letzten Punkt:

    3. Oder muss die .NET DLL Unmanaged Export Methoden anbieten

    Tja, was wir kriegen weiss ich noch nicht (werde ich gleich mal nachfragen), aber Unmanaged exportierte Funktionen sind doch IMHO normale DLL-Funktionen, wie in jeder anderen DLL auch, oder? Dann müsste ich einfach mit

    handle = LoadLibrary("dll-name")
    

    die DLL laden (in C / WinAPI) und mit

    func = GetProcAdress(handle, "func-name")
    

    die Adresse der Funktion bekommen. Oder habe ich da etwas mit "unmanaged Export Methoden" falsch verstanden.

    Aber was mich viel mehr interessiert ist (wenns in .NET überhaupt geht 😕 ), wie man Managed (Export) Methoden von der nativen Seite ansprechen kann, so mit Parameter-Marshaling etc. (so wie's auch mit Java geht).

    Also, der letzte Punkt brennt mir persönlich unter den Fingernägeln, aber auch bei den anderen Punkte scheine ich noch Erklärungsbedarf zu haben...

    Achja,

    1. .NET-Framework normal installiert ( klingt nämlich irgend wie anders! )

    Das habe ich verstanden (stolz), war mir schon klar, sonst habe ich ja gar keine Laufzeitblibliotheken für .NET-Code, etc.
    Trotzdem schon mal vielen Dank für dene Mühe!

    Viele Grüsse,
    Wischmop


Anmelden zum Antworten