C++ DLL erzeugen

Gast #4859472
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
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 #4859517
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.
Gast #4859537
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.