none
c# dll in c++ aufrufen RRS feed

  • Frage

  • hi leute,

    ich baue gerade folgende sache nach:

    http://www.computerbase.de/forum/showthread.php?t=636766

    folgenden c# code habe ich geschrieben und damit eine dll erzeugt, welche ich dann in eine tlb datei umgewandelt habe:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MCS
    {
        [System.Runtime.InteropServices.ComVisible(true)]
        public interface IMCS
        {
            void setParam(string param);
    
            string getParam();
        }
    
        [System.Runtime.InteropServices.ComVisible(true)]
        public class MCS : IMCS
        {
            string param;
    
            public void setParam(string param)
            {
                this.param = param;
            }
    
            public string getParam()
            {
                return this.param;
            }
        }
    }

    diesen c# code habe ich in einem class library projekt geschrieben. an den einstellungen die mir vs standartmäßig erzeugt hat, habe ich nichts verändert. der code wurde in ein file geschrieben welches Class1.cs heißt.

    nun habe ich die tlb datei in das verzeichnis meines c++ projekts kopiert (dort unter debug wo es anscheint erwartet wird). leider bekomme ich folgende fehlermeldung:

    " 1 IntelliSense: cannot open source file "c:/Users/documents/visual studio 2013/Projects/MCW/MCW/Debug/MCS.tlh" c:\Users\Documents\Visual Studio 2013\Projects\MCW\MCW\WinMain.cpp 6 1 MCW

    "

    #include <windows.h>
    #include <comutil.h>
    
    #pragma comment(lib, "comsuppw.lib")
    
    #import "MCS.tlb"
    
    INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
    {
    
    }


    das #import "MCS.tlb" ist rot unterstrichen. könnt ihr mir sagen was ich falsch gemacht habe?


    Mittwoch, 17. Juni 2015 18:05

Antworten

  • Hallo,
    ich bin jetzt war nicht der große Experte darin, aber für solche Sachen gibt es C++/CLI. Vielleicht hilft dir der folgende Link weiter.

    Viele Grüße Holger M. Rößler

    Mittwoch, 17. Juni 2015 20:04
  • Hallo,

    das, was du vorhast, habe ich so noch nicht gemacht. Ich hatte mal aus einer vorhandenen TLB-Datei in einer MFC-Anwendung eine Schnittstelle zu Excel erstellen lassen. Dabei werden aus der gewählten TLB-Datei alle Klassen angezeigt, und man kann die auswählen, zu denen man eine MFC-Klasse generiert haben möchte.

    Das geht in einem MFC-Projekt über das Kontextmenü im Projektmappenexplorer / Klassen-Assistent... / rechts beim Button "Klasse hinzufügen..." auf den Pfeil klicken / MFC-Klasse aus der Typbibliothek / Radiobutton "Datei" / dann deine TLB-Datei auswählen.

    Ob deine erstellte TLB-Datei dazu kompatibel ist, wäre herauszufinden.

    Abgesehen davon wäre C++/CLI, das direkt die C#-DLL einbindet, wohl der einfachere Weg.

    Gruß
    Heiko

    Donnerstag, 18. Juni 2015 10:36

Alle Antworten

  • Hallo,
    ich bin jetzt war nicht der große Experte darin, aber für solche Sachen gibt es C++/CLI. Vielleicht hilft dir der folgende Link weiter.

    Viele Grüße Holger M. Rößler

    Mittwoch, 17. Juni 2015 20:04
  • Hallo,

    Hast Du deine Datei  mit regasm registriert ( Punkt 7 )?

    Ein Standardkonstruktor ohne Aufrufparameter  fehlt noch in dener Klasse.

    Grüße



    • Bearbeitet Iso7 Mittwoch, 17. Juni 2015 21:39
    Mittwoch, 17. Juni 2015 21:32
  • danke, den standartkonstruktor habe ich übersehen und ihn nachgetragen.

    außerdem habe ich punkt 7 übersehen ^^

    das mit regasm mache ich jetzt. mir ist aber nicht ganz klar wie das einfluss auf den aufruf der tlb haben kann die ja zuvor erzeugt wird. die dll pack ich auch nicht ins c++ projekt, weil da laut anleitung nur die tlb hin soll - oder hab ich was falsch verstanden?

    Mittwoch, 17. Juni 2015 21:37
  • und bei regasm bekomme ich schonmal den fehler RA0000 geschmissen, die console sagt mir, dass mir adminrechte fehlen - ähm, was mach ich jetzt?
    Mittwoch, 17. Juni 2015 21:40
  • Konsole mit Adminrechten starten.

    Z.B. Unter Windows 7 im Eingabefeld cmd eingeben und dann mit [Strg+Shift+Enter] bestätigen.

    Mittwoch, 17. Juni 2015 21:51
  • Man kann nicht jede beliebige C++ DLL in C# verwenden!
    Ohne zu wissen welcher Art deine C++ DLL ist, kann man diese Frage eigentlich nicht wirklich beantworten. Insbesondere ist eine Beschreibung der Schnittstelle wichtig.

     Kannst Du die Schnittstelle deiner DLL beschreiben?

    Gruß 


    - Florian

    Donnerstag, 18. Juni 2015 06:46
  • Hallo Florian,
    es geht doch um den umgekehrten Fall. Der TO möchte eine C# DLL in C++ aufrufen.

    Wie ich aber bereits schrieb, ist sehr wahrscheinlich der Weg über C++\CLI der sauberste und wahrscheinlich auch einfachste Weg. Deshalb gibt es diese PS ja.


    Viele Grüße Holger M. Rößler

    Donnerstag, 18. Juni 2015 06:52
  • Hallo Holger,

    Du hast recht, hab das falsch gelesen. Vermutlich weil die andere Richtung öfter vorkommt. Stimme Dir da vollkommen zu, C++\CLI sollte der sauberste Weg sein.

    Meine obige Aussage ist in umgekehrter Richtung natürlich weitestgehend zutreffend - ohne eine entsprechende C-Schittstelle sollte es kaum funktionieren. Was wieder auf C++\CLI hinaus läuft.

    Gruß


    - Florian

    Donnerstag, 18. Juni 2015 06:57
  • Hallo,

    das, was du vorhast, habe ich so noch nicht gemacht. Ich hatte mal aus einer vorhandenen TLB-Datei in einer MFC-Anwendung eine Schnittstelle zu Excel erstellen lassen. Dabei werden aus der gewählten TLB-Datei alle Klassen angezeigt, und man kann die auswählen, zu denen man eine MFC-Klasse generiert haben möchte.

    Das geht in einem MFC-Projekt über das Kontextmenü im Projektmappenexplorer / Klassen-Assistent... / rechts beim Button "Klasse hinzufügen..." auf den Pfeil klicken / MFC-Klasse aus der Typbibliothek / Radiobutton "Datei" / dann deine TLB-Datei auswählen.

    Ob deine erstellte TLB-Datei dazu kompatibel ist, wäre herauszufinden.

    Abgesehen davon wäre C++/CLI, das direkt die C#-DLL einbindet, wohl der einfachere Weg.

    Gruß
    Heiko

    Donnerstag, 18. Juni 2015 10:36
  • hallo leute,

    danke für die ganzen antworten.

    @florian, die schnittstellen stehen oben im code drin, oder was meinst du?

    mir sagt vs im c++ programm das mit eine MCS.tlh datei fehlt, kann es sein dass ich einfach vergessen habe etwas entsprechendes anzulegen? zu tlh steht leider nichts in der anleitung

    zu den anderen vorschlägen finde ich leider keine leichte anleitung. das regams hat jetzt geklappt, aber warum macht man das?


    Samstag, 20. Juni 2015 18:56
  • Hallo,

    wie ich oben schrieb, bin ich von einer C++ DLL ausgegangen - weil dies üblicher ist und zum anderem weil die Frage nach dem Aufruf einer C#-DLL aus C++ erst im Februar gestellt und beantwortet wurde. (Relevanteste ähnliche Threads - bei mir mit passendem Link an erster Stelle).
    Die Frage hätte sich darauf bezogen was deine DLL exportiert, ist hier aber unzutreffend. Kurz gesagt, die Frage nach der Schnittstelle hat sich erledigt.

    Gruß


    - Florian

    Montag, 22. Juni 2015 06:30
  • Hallo,

    mit Regasm registriert Du deine Assembly. 

    Hier gibt es noch eine Einleitung. Ich hoffe, dass das Dir kann helfen.

    Grüße

    Montag, 22. Juni 2015 10:31
  • Hallo 'System.AccessViolationException',

    Ich gehe davon aus, dass Holgers und Heikos Antworten Dir weitergeholfen haben. Solltest Du noch Rückfragen dazu haben, gib bitte Bescheid.

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 29. Juni 2015 07:30
    Administrator