C++ DLL erzeugen

Gast #4859472
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.
Gast #4859514
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);
Gast #4859537
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.
#4859546
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.
Gast #4859555
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.
Persönliche Seite #4859563
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.
Gast #4859578
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren