Forum: PC-Programmierung C++ DLL erzeugen


von Leon (Gast)


Lesenswert?

Hallo, in Visual Studio C++ sol eine DLL Datei erzeugt und im Anschluss 
in C# benutzt werden.

main.h
1
#include <iostream>
2
using namespace std;
3
4
namespace TEST
5
{
6
  class AusgabeText
7
  {
8
  public:
9
    static __declspec(dllexport) void Text(void);
10
  };
11
}

main.cpp
1
#include "main.h"
2
3
namespace TEST
4
{
5
  void AusgabeText::Text(void)
6
  {
7
    cout << "TEST!" << endl;
8
  }
9
}

Das Einbinden der DLL Datei in ein C# Projekt funktioniert nicht.
Es erscheint folgende Fehlermeldung:

A reference to TEST.dll could not be added. Please make sure that the 
file is accessible, and that it is a valid assembly or COM component.

von Peter II (Gast)


Lesenswert?

C++ wird nicht gehen, du musst eine "C" Schnittstelle mit der DLL 
umsetzen. (Export Namen für keine "Name mangling" haben, intern darfst 
du C++ scheiben)

Dann darfst du die Dll nicht als Assembly einbinden
https://msdn.microsoft.com/de-de/library/cc431203.aspx

von Leon (Gast)


Lesenswert?

Ok die main Datei habe ich in eine C Datei abgeändert.

von seho85 (Gast)


Lesenswert?

Hi,

das Problem ist das du versucht von managed C# Code auf unmanged C++ 
Code zuzugreifen.

Schau dir mal folgendes an: 
https://blogs.msdn.microsoft.com/junfeng/2006/05/20/sample-mixing-unmanaged-c-ccli-and-c-code/

Hier wird beschrieben wie man per C# über einen CLI-Wrapper unmanged 
Code ansprechen kann.

MfG
Sebastian

von Chris F. (chfreund) Benutzerseite


Lesenswert?


von moep (Gast)


Lesenswert?

z.B.

C++:
1
extern "C" __declspec(dllexport) void __stdcall Function(void)
2
{
3
}

C#:
1
// native method import
2
[DllImport("MeineDLL.dll", CallingConvention = CallingConvention.StdCall)]
3
public static extern void Function(void);

von Leon (Gast)


Lesenswert?

Ein C++ CLR Projekt möchte ich nicht erstellen. Ich möchte quasi ein 
bestehendes C++ Projekt mit c und cpp Dateien in eine C# Applikation 
über eine lib oder dll einbinden können.

von Leon (Gast)


Lesenswert?

main.cpp
1
#include <stdio.h>
2
3
extern "C" __declspec(dllexport) void __stdcall Function(void)
4
{
5
  printf("TEST\n");
6
}

In C# Kann ich nun die Funktion Function ausführen. Allerdings erscheint 
im Ausgabefenster der Text TEST nicht.

von Michael B. (laberkopp)


Lesenswert?

Leon schrieb:
> Hallo, in Visual Studio C++ sol eine DLL Datei erzeugt und im Anschluss
> in C# benutzt werden.

C# verlangt "managed" C++.

Man bindet auch nicht die DLL ein sondern die erzeugte LIB Datei.

Und man exportiert möglichst keine Klassenfunktionen, selbst static sind 
die Namen ätzend "mangled" (und ohne static wäre die Frage, zu welcher 
Klasseninstanz die Funktion gehört, self muss man dann mit übergeben).

Leon schrieb:
> Ein C++ CLR Projekt möchte ich nicht erstellen. Ich möchte quasi ein
> bestehendes C++ Projekt mit c und cpp Dateien in eine C# Applikation
> über eine lib oder dll einbinden können.

Kannst du wegen managed code ziemlich vergessen. Verfolge seho85's Weg.

Denk dran: Ein C# Programm hat eine Speicherverwalrung ähnlich Java, ein 
C++ Programm würde da unendlich viele nicht freigegebene Objekte übrig 
lassen. Wenn natürlich alles schön gekapselt ist, kann man die DLL 
entladen und damit alles wegwerfen. Man darf nur keine Pointer auf 
gealloctes übergeben.

von Peter II (Gast)


Lesenswert?

Michael B. schrieb:
> Man bindet auch nicht die DLL ein sondern die erzeugte LIB Datei.

nein, klar bindest man DLLs ein. Brauchst man ständig vom wenn etwas 
näher am System programmiert.

> Kannst du wegen managed code ziemlich vergessen.
nein.

> Denk dran: Ein C# Programm hat eine Speicherverwalrung ähnlich Java, ein
> C++ Programm würde da unendlich viele nicht freigegebene Objekte übrig
> lassen.
nein würde es nicht, man muss es nur richtig machen.

> Wenn natürlich alles schön gekapselt ist, kann man die DLL
> entladen und damit alles wegwerfen.
beim entladen wird kein Speicher der gealloct wurde freigegeben, bringt 
also überhaupt nichts.

> Man darf nur keine Pointer auf gealloctes übergeben.
auch das darf man machen, man muss auch passenden Free implementieren.

von Chris F. (chfreund) Benutzerseite


Lesenswert?

Michael B. schrieb:
> Denk dran: Ein C# Programm hat eine Speicherverwalrung ähnlich Java, ein
> C++ Programm würde da unendlich viele nicht freigegebene Objekte übrig
> lassen.

Dieser Satz ist auf mehrere viele Arten Unsinn.
Die Speicherverwaltung der CLR hat nichts damit zu tun, wenn eine native 
Binary aufgerufen wird. Außerdem gibt es auch "C++-.net" das auch die 
CLR verwendet.

von Graf von Rotzenhausen am Sekretberge (Gast)


Lesenswert?

Man hätte bei praktisch jeder Programmiersprache außer C++ und jedem 
Betriebssystem ein Problem damit, C++-Binarys direkt zu verwenden ...
Ohne Veränderung des vorhandenen Codes bleibt in diesem Fall hier nur 
ein C++/CLI-Wrapper, mit Veränderung extern C + P/Invoke oder COM (einen 
separaten lokalen Prozess und IPC oder Client/Server schließe ich mal 
aus).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.