Entwickler-Ecke

Basistechnologien - c++ header file -> c# portieren


chubbson - Mo 27.04.09 09:07
Titel: c++ header file -> c# portieren
Guten Morgen.
Ich habe eine banale Frage und bräuchte kurz eure Unterstützung.

Es geht darum, wie ich c++ headerfiles nach c# portieren kann.

Ich nehm mal nicht an das ich da einfach schnell in VS mal auf ein Portier knopf drücken kann und der schreibt mir schnell alles um ;D (reflektion mässig)

Hier ein paar snippet:
Aus dem c++ headerfile..


C#-Quelltext
1:
2:
#ifndef Test_H
#define Test_H

Kann ich 1 zu 1 in c# schreiben, nehm ich an


C#-Quelltext
1:
#include <windows.h>                    

Das schreib ich um und nehms ins using
using System.Windows;


C#-Quelltext
1:
#define TEST_VERSION 0x160                    

Das denk ich kann ich so belassen.


C#-Quelltext
1:
2:
3:
4:
5:
#ifdef TESTDLL
#define EXPORT  __declspec(dllexport)
#else
#define EXPORT
#endif

Hier weiss ich nich genau was der __declspec(dllexport) genau soll und wofür der zuständig is.


C#-Quelltext
1:
#define CALL __stdcall                    

kann ich gleich implementieren um damit dann später die DLL funktonen aufurufen..


C#-Quelltext
1:
typedef DWORD HTARGET;                    

hmm hier müsst ihr mir kurz sagen wie das in c# ausschauen soll. sowas wie DWord gibs da doch nimcht merh oder?


C#-Quelltext
1:
#define ARGB(a,r,g,b)  ((DWORD(a)<<24) + (DWORD(r)<<16) + (DWORD(g)<<8) + DWORD(b))                    

Hier das selbe.. da kann ich mir auf die schnell keinen reim machen. Mit Bitoperatoren hab ich leider noch nie mit gearbeitet.


C#-Quelltext
1:
#define  BLEND_ZWRITE    4                    

Kann ich so belassen um den Variablen Bitwerte zuzuweisen (0,1,2,4,8,16)


C#-Quelltext
1:
2:
3:
4:
5:
enum testBoolState
{
  TEST_DONTSUSPEND  = 24,  // bool    focus lost:suspend?  (default: false)
  TEST_HIDEMOUSE    = 25,  // bool    hide system cursor?  (default: true)
};

Einem Enum kann man in c# auch den feldern eigene Werte geben, sollt also auch kein problem sein


C#-Quelltext
1:
2:
3:
4:
5:
struct testVertex
{
  float      x, y;  
  DWORD      col;    
};

EIn struct.. hab ich auch noch nie angewendet.. gibt es das noch in c#


So und jetzt mein grösstes problem .. eine interfaceklasse die Funktionen aus einer DLL zur verfügung stellt.

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
/*
** TEST Interface class
*/

class TEST
{
public:
  virtual  void    CALL  Release() = 0;
        virtual char*    CALL  System_GetErrorMessage() = 0;

        virtual void*    CALL  Resource_Load(const char *filename, DWORD *size=0) = 0;
  virtual void    CALL  Resource_Free(void *res) = 0;

Mit diesen 4 beispielfunktionen sind glaube ich alle vorkommenden Funktionen abgedekt..
Was mache ich mit diesen char *filename und Dword..
Soweit ich weiss kann ich ja nicht mehr wirklich mit pointern etc in c# arbeiten .


C#-Quelltext
1:
extern "C" { EXPORT TEST * CALL testCreate(int ver); }                    

Hmm für was steh hier das extern?

Naja das waren mal die wichtigsten FUntionen und definitionen in dem header File..
Wie ihr vielleicht sehen konntet.. fehlen mir die grundlagen auf der Binär ebene.


Wenn es dann soweit is.. und man alles portieren konnte ... dann nehm ich das ganz einfach in das using rein.
für die Files die es dann später benötigen.

Vielen Dank für eure Hilfe.


Th69 - Mo 27.04.09 10:22

Ich verstehe noch nicht so ganz, warum du ein C++ Headerfile 1:1 nach C# portieren willst?

Wenn du eine DLL mit C-Schnittstellenfunktionen hast, dann kannst du diese von C# aus mittels 'PInvoke' aufrufen (weiteres Stichwort dazu: [DllImport]).

Oder willst du einen kompletten C++ Sourcecode nach C# portieren? Dann solltest du dich aber näher mit C++ als auch C# auskennen (denn deine Kommentare deuten auf geringe (bzw. falsche) Kenntnisse in beiden Sprachen hin).

Ich befürchte aber, daß du eine C++ DLL von C# aus aufrufen möchtest (Klasse TEST) und da kann ich dir gleich sagen, daß das definitiv NICHT gehen wird.
Eine C++ DLL ist immer nur mit derselben C++ Compilerversion lauffähig, mit der sie erstellt wurde (also noch nicht einmal kompatibel zu anderen C++ Compilern - geschweige denn anderen Programmiersprachen!!!).

Du müßtest also ersteinmal eine C-Schnittstelle bereitstellen. Da die Klasse TEST jedoch auch noch virtuelle Methoden benutzt, sieht es noch schlechter aus (da C direkt keine virtuellen Methoden unterstützt - da es eben nicht auf OOP aufbaut).


chubbson - Mo 27.04.09 10:38

Danke für deine Antwort..

Es existiert eine DLL deren Funtkionen eben mit diesen Headerfiles zur verfügung gestellt werden.

Ich möchte die DLL Funktionen alle in c# zu verfügung stellen. Meines Wissens wurde die DLL auch in c++ geschrieben.
Bis jetzt hatte ich noch nie Probleme mit der c++ dll ob ich nun die Anwendungen mit vs08 oder einem Borland Compiler
compiliert habe..


In zwischenzeit hab ich gelesen das man bereits ein .Net wrapper für diese dll in c# geschrieben habe.
jedoch war die Verlinkung auf derer man die Files finden sollte tot.


Kha - Mo 27.04.09 11:31

user profile iconchubbson hat folgendes geschrieben Zum zitierten Posting springen:
Ich nehm mal nicht an das ich da einfach schnell in VS mal auf ein Portier knopf drücken kann und der schreibt mir schnell alles um ;D
Einen Versuch wäre es wert ;) : http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120

Wie Th69 aber schon sagte, beschränkt sich P/Invoke auf C-Dlls, also nichts mit OOP. Für die Klasse solltest du mit C++/CLI eine managed Wrapper-Klasse erstellen können.