Forum: PC-Programmierung C++ DLL erzeugen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Leon (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Ok die main Datei habe ich in eine C Datei abgeändert.

von seho85 (Gast)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht lesenswert

von moep (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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


Bewertung
-1 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.