Benutzer mit den meisten Antworten
c# dll in c++ aufrufen

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?
- Bearbeitet 'System.AccessViolationException' Mittwoch, 17. Juni 2015 18:08
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
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 22. Juni 2015 06:49
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 29. Juni 2015 07:30
-
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- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 22. Juni 2015 06:48
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 29. Juni 2015 07:30
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
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 22. Juni 2015 06:49
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 29. Juni 2015 07:30
-
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?
-
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
-
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
-
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
-
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- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 22. Juni 2015 06:48
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 29. Juni 2015 07:30
-
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?
- Bearbeitet 'System.AccessViolationException' Samstag, 20. Juni 2015 18:57
-
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
-
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ß,
DimitarBitte 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.