Laden...

C++ in C# einbinden

Erstellt von Ifoko vor 18 Jahren Letzter Beitrag vor 18 Jahren 25.935 Views
I
Ifoko Themenstarter:in
256 Beiträge seit 2005
vor 18 Jahren
C++ in C# einbinden

Hallo!

Ich habe folgendes Problem:
Ich habe ein c# Projekt und ein c++ Projekt. Alle auf MS Visual .net 2003.

Wie rufe ich jetzt von c# eine c++ Funktionen auf.
Muss ich das mit dllimport machen ?
Suche schon einige Zeit und hab leider noch kein passendes Bsp gefunden.
Wo steht das beschrieben wie das geht ?

Danke

lg Ifoko

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo Ifoko!

Du hast alles auf VS2003?

Dann ist es einfach:

Gehe in dein C++ - Projekt (Das sollte ja dann managed C++ sein, weil in VS2003!).

Gehe in Deine Projekteigenschaften und suche unter "Common Properties" und "General" die Eigenschaft "OutputType" und setze diese auf "ClassLibrary" (englisches VS!).

Danach kompilierst Du das.

Wenn Du jetzt in deinem C#-Projekt die Referenz dieser .dll-Datei einbindest (Rechts-Klick auf References->Add Reference->Browse->dll Auswählen) dann solltest Du auf Deine C++ - Funktionen zugreifen können.

Achtung: Namespaces beachten, notfalls immer mit dem ganzen Namespace und Klassennamen ansprechen.

Solltest Du noch Detaillierteres wissen wollen frage nach...

Ciao
Norman-Timo

[EDIT] Rechtschreibfehler [/EDIT]

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

I
Ifoko Themenstarter:in
256 Beiträge seit 2005
vor 18 Jahren

Danke für die Hilfe.

Leider hab ich Probleme beim einbinden von der .dll mit einer komischen Fehlermeldung

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo Ifoko!

Ist denn der C++ Code auch mit VS2003 kompiliert worden?

Denn wenn ja, dann versteh ich diese Fehlermeldung nicht.

Eine andere Notlösung wäre, dass Du den Sourcecode direkt in deinem aktuellen Code mit einfügst, also in etwa so:

RechtsKlick auf dein Projekt -> Einfügen -> Existierendes Element -> und dann deine cpp Datei einbinden.

Danach sollte auch beim kompilieren und auch schon beim Codieren der Zugriff auf deine Methoden möglich sein.

Das ist allerdings keine schöne Variante, da das eine Vermengung unterschiedlicher Sprachen bedeutet, was zwar funktioniert, aber unschön ist.

Sorry, wenn das auch nicht klappt, dann bin zumindest ich am Ende meines Lateins.

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

I
Ifoko Themenstarter:in
256 Beiträge seit 2005
vor 18 Jahren

Danke norman für die Hilfe.

Leider hab ich Probleme beim einbinden von der .dll mit einer komischen Fehlermeldung

Es steht dass die scan.dll jetzt kein gültiges Assembly ist.
Ich hab als Output dll eingestellt.
Hoffe Bild ist besser.

1.373 Beiträge seit 2004
vor 18 Jahren

Du kannst DLLs nur dann als Referenz einbinden, wenn es .NET oder COM-DLLs sind. Für native DLLs musst du entweder einen Wrapper schreiben (in Managed C++) oder die Funktionen mittels DllImport einbinden.

MfG VizOne

I
Ifoko Themenstarter:in
256 Beiträge seit 2005
vor 18 Jahren

Original von norman_timo
Hallo Ifoko!

Ist denn der C++ Code auch mit VS2003 kompiliert worden?

Denn wenn ja, dann versteh ich diese Fehlermeldung nicht.

Eine andere Notlösung wäre, dass Du den Sourcecode direkt in deinem aktuellen Code mit einfügst, also in etwa so:

RechtsKlick auf dein Projekt -> Einfügen -> Existierendes Element -> und dann deine cpp Datei einbinden.

Danach sollte auch beim kompilieren und auch schon beim Codieren der Zugriff auf deine Methoden möglich sein.

Das ist allerdings keine schöne Variante, da das eine Vermengung unterschiedlicher Sprachen bedeutet, was zwar funktioniert, aber unschön ist.

Sorry, wenn das auch nicht klappt, dann bin zumindest ich am Ende meines Lateins.

Ciao
Norman-Timo

Das funktioniert auch nicht. Es ist zwar dann .cpp im Projekt drin, aber nur als Textdatei, dh. sie wird nicht kompelliert;

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo Ifoko!

Also hab mal Spaßeshalber ein C++ Project in VS2003 und ein C#-Projekt aufgemacht,

und es ließ sich so kompilieren wie vorgeschlagen.

Es ist aber so, dass C++ Code nicht gleich C++ Code ist (unter .NET!).

Sollte Dein C++ Code importiert sein, dann musst Du tatsächlich ein dllimport benutzen, so wie VizOne es sagt.

Also nochmal genau meine Frage, ist das C++ Code, der auch mit VS2003 erstellt worden ist?

Wenn nicht, dann gibt es ein Problem mit der Assembly, da beim "alten" C++ keine Metainformationen in der Dll mitgeführt werden (unter .NET C++ aber schon)

Deshalb gibt es auch so komische "__gc" Deklarationen vor allen public Klassen, was nichts weiter aussagt, dass die Metainformationen beim Kompilieren mitgeführt werden.

Als einfachste Lösung wäre (nochmal): dllimport, aber der umständlichere Weg wäre folgender:

Mache ein neues C++ (managed) Projekt im VS2003 auf, kopiere den Sourcecode in jeweils neu erstellten Dateien (die genauso heißen, wie die alten) versuche zu kompilieren und merze die zigTausend Kompilierungs- und Linkungsfehler aus.

Wenn Du das geschafft hast, dann verdienst Du einen Orden 🙂

Für weitere Fragen, bitte hier stellen.

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

I
Ifoko Themenstarter:in
256 Beiträge seit 2005
vor 18 Jahren

Hallo VizOne!

Danke für die Antwort.
Wo kann ich das einstellen ?
Den Source hab ich. und er ist in VC 2003 erstellt worden.

Ich glaub irgendwie sind die Settings fürs dll erzeugen falsch.

lg

Ifoko

L
667 Beiträge seit 2004
vor 18 Jahren

Hi !

Also die Aussage, "wenn es mit VS2003 geschriebenes C++ ist, dann muss es ja managed C++ sein" - ist leider nicht richtig.

Mit dem VS2003 kann man genauso gut auch unmanaged C++ produzieren. Das kann bei dem C++-Projekt in den Projekteigenschaften eingestellt werden (Projekteigenschaften -> Konfigurationseigenschaften -> Allgemein -> Verwaltete Erweiterungen verwenden).

EDIT : Standardmäßig ist ein neu angelegtes C++ - Projekt übrigens "nicht verwaltet", daher empfiehlt es sich, da erstmal die managed extensions zu aktivieren, dann sollte das Einbinden ins C# - Projekt mittels dllimport kein Problem sein...

Umgekehrt ist es übrigens einfacher, C#-Code lässt sich problemlos von C++ aufrufen, allerdings nur wenn Managed Extensions aktiviert sind. Dann nämlich kann man auch bei C++-Projekten ganz normal wie bei C# mit Projektverweisen und #using arbeiten...

"It is not wise to be wise" - Sun Tzu

I
Ifoko Themenstarter:in
256 Beiträge seit 2005
vor 18 Jahren

Danke für die Hilfe.

Hab das Problem gefunden. Man muss im C++ bei den Projekteigenschaften Allgemein -> verwaltete Erweiterungen verwenden auf -> Ja.
(Wie im Beitrag oben beschrieben; thx)

Dann läßt sich die .dll problemlos einbinden.(wie noch weiter oben beschrieben, thx)

Jetzt gibts allerdings noch Probleme mit den Namespace.
Wo seh ich den? Wie muss ich das "using" schreiben, damit ich zB. typische structs in c# ansprechen kann.

lg ifoko

I
Ifoko Themenstarter:in
256 Beiträge seit 2005
vor 18 Jahren
Nochmals Hilfe bitte

Das c++ Projekt ist jetzt eingebunden ins C# Projekt (Verweis, Projekt).

Die Klassen aus den C++ kann ich problemlos definieren, der Compiler mekert nicht.

Sobald ich jedoch zum Code komme, gibts filenot Found, der Assemblyname konnte nicht gefunden werden.
Ich habe aber das Projekt eingebunden.

Wo stehen die Assemblyanmen? oder wie muss ich das mit using machen ?

alles in MS VS 2003

Besten Dank

Fehlermeldung:

'CS.exe': 'c:\windows\assembly\gac\system.windows.forms\1.0.5000.0__b77a5c561934e089\system.windows.forms.dll' geladen, keine Symbole geladen.
'CS.exe': 'c:\windows\assembly\gac\system\1.0.5000.0__b77a5c561934e089\system.dll' geladen, keine Symbole geladen.
'CS.exe': 'c:\windows\assembly\gac\system.drawing\1.0.5000.0__b03f5f7f11d50a3a\system.drawing.dll' geladen, keine Symbole geladen.
Eine nicht behandelte Ausnahme des Typs 'System.IO.FileNotFoundException' ist in system.windows.forms.dll aufgetreten.

Zusätzliche Informationen: Datei- oder Assemblyname 'scan' oder eine Abhänigkeit davon wurde nicht gefunden.

Das Programm "[1032] CS.exe" wurde mit Code 0 (0x0) beendet.

1.373 Beiträge seit 2004
vor 18 Jahren

Benötigt "scan" vielleicht noch eine andere DLL? Diese muss die Laufzeit auch finden können, d.h. am besten, du schiebst sie mit ins Anwendungsverzeichnis.

MfG VizOne

I
Ifoko Themenstarter:in
256 Beiträge seit 2005
vor 18 Jahren

Danke VizOne.

scan hatte noch eine andere dll benötigt.

I
Ifoko Themenstarter:in
256 Beiträge seit 2005
vor 18 Jahren

So nächstes Problem.

Ich habe in VS 2003 ein c++ Projekt. Aus der will ich ein .net dll machen.
Dies ist alter c/c++ Code

Wenn ich das Projekt jetzt linken will bekomme ich LNK2001 __check_commonlanguageruntime_version

Es sind Funktionen die in den alten "Ansi C" libs sind.
<math.h>,<conio.h>...

Diese Symbole findet er nicht.
Solche kann man hoffentlich schon irgenwie einbinden ?

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Ifoko,

If the LNK2001 diagnostic text reports that __check_commonlanguageruntime_version is an unresolved external symbol, see LNK2019 for information on how to resolve.

herbivore

I
Ifoko Themenstarter:in
256 Beiträge seit 2005
vor 18 Jahren

Also es geht so wie im Artikel beschrieben.

ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1031/vcmex/html/vcconConvertingManagedExtensionsForCProjectsFromPureIntermediateLanguageToMixedMode.htm

bzw auf deutsch

Konvertieren von Managed Extensions for C++-Projekten aus reiner Intermediate Language in den gemischten Modus

Dann kann man auch in Projekten arbeiten wo es noch (alte) C Programmierer gibt ,die nicht ohne ihre printf auskommen.

lg Ifoko

L
667 Beiträge seit 2004
vor 18 Jahren

Wenn es egal ist, ob die C++ dll managed oder unmanaged ist, dann kannst du in den Projekteigenschaften des C++ Projektes unter Konfigurationseigenschaften -> Allgemein -> Verwaltete Erweiterungen verwenden auf "true" setzen.

Danach kannst Du die C++ dll als Verweis einbinden, so wie Norman es am Anfang des Threads beschrieben hat.

Ist dir das managed/unmanaged nicht egal, dann kommst D nicht drumherum mit DllImport zu schaffen, was aber auch nicht besonders schwierig ist.

Edit : Ups, ich hab nicht gesehen, dass der Thread 2 Seiten hat, sorry...

"It is not wise to be wise" - Sun Tzu

I
Ifoko Themenstarter:in
256 Beiträge seit 2005
vor 18 Jahren

Hi Lynix!

Hast vollkommen recht.
Wenn man auf "verwalteten Code" aktiviert und schön brav einen Namespace vergibt, kann man sehr schön arbeiten. Sogar mit Debugger.

lg Ifoko