*.h Datei in C# importieren
-
Hallo.
ich habe eine *.h Datei, in der sich lediglich #define zeilen stehen, die einem cpp projekt angehören.
die #defines sind nun aber auch in einem C# Projekt von Bedeutung und möchte die *.h datei in das C# Projekt "includieren".
Ist das in irgendeiner weise möglich?
danke
-
Das geht nicht.
#define ist nur ein preprozessor makro, das kann C# nicht.
Um die selben Werte auch auf C# seite zu haben must du das ganze so verpacken, das ein marshaler es verabeiten kann, also enum in nem COM/IDL interface, static member einer klasse, ... oder schreibt die ein kleines script, dass du im pre-build step laufen lässt und das dir den C++ code nach C# konvertiert. Da es ja nur #define's sind dürfte das nicht alzu aufwendig werden.
-
hallo.
das übersteigt leider meine bisherigen fähigkeiten.
kannst du mir mit etwas sourcecode helfen?
-
http://www.c-plusplus.net/forum/viewtopic-var-t-is-183809.html
Nehme mal an es gibt ein IDL file wo das interface zu deinem COM-Server definiert ist.
Anstatt jetzt #define's in ein h file zu schrieben, schreib sie ins IDL file z.b.:typedef enum MY_DEFINES { MY_DEFINE1 = 1, MY_DEFINE2 = 2, MY_DEFINE3 = 3, } MY_DEFINES;
Jetzt kannst du die Werte als MY_DEFINE1, MY_DEFINE2, MY_DEFINE3 auf C++ Seite ansprechen und als MY_DEFINES.MY_DEFINE1, MY_DEFINES.MY_DEFINE2, ... auf C# seite.
-
Hallo.
auf C++ Seite funktioniert das ohne Probleme.
Was muss ich auf C# Seite noch tun?
Ich habe bereits ein Objekt der Schnittsstelle erzeugt...
-
Was genau geht dann auf C# nicht?
Das sollte auf C# Seite genau so gehen, nur dem unterschied, dass deine werte in C# nicht im globalen namspace liegen, sondern innerhalb vom enum.
IDLtypedef enum MY_ENUM_NAME { MY_DEFINE1 = 1, MY_DEFINE2 = 2, } MY_DEFINES;
C++
x = MY_DEFINE1
C#
x = MY_ENUM_NAME.MY_DEFINE1
-
hallo.
ich glaub ich hab noch etwas vergessen, aber was..
das ist ein auszug aus meiner IDL-Datei.
interface ICOMMyDB : IDispatch{ [id(1), helpstring("method exit")] HRESULT exit([in] LONG clientId, [in] BSTR command); [id(2), helpstring("method user")] HRESULT user([out] LONG* clientId, [in] BSTR command); [id(3), helpstring("method create")] HRESULT create([in] LONG clientId, [in] BSTR command); [id(4), helpstring("method insert")] HRESULT insert([in] LONG clientId, [in] BSTR command); [id(5), helpstring("method select")] HRESULT select([in] LONG clientId, [in] BSTR command, [out] BSTR* result, [out] LONG* colCnt); [id(6), helpstring("method drop")] HRESULT drop([in] LONG clientId, [in] BSTR command); typedef enum MY_DEFINES { MY_DEFINE1 = 1, MY_DEFINE2 = 2, }MY_DEFINES; };
in meinem C# Projekt habe ich folgende Einträge
CCOMMyDBAtlSrvDllLib.ICOMMyDB db; ... db = new CCOMMyDBAtlSrvDllLib.COMMyDBClass();
aber einen Zugriff auf MY_DEFINES habe ich zu diesem Zeitpunkt noch nicht.
-
hmm.. weiß gar nicht ob COM eingebette datenstrukturen erlaubt, müsste ich erst nachschlagen => dein enum ist innerhalb von ICOMMyDB.
Aber da es der IDL compiler zu schlucken scheint, versucht mal mit ICOMMyDB.MY_DEFINES.MY_DEFINEX
Falls es nicht geht, nimm das enum raus:interface ICOMMyDB : IDispatch{ [id(1), helpstring("method exit")] HRESULT exit([in] LONG clientId, [in] BSTR command); [id(2), helpstring("method user")] HRESULT user([out] LONG* clientId, [in] BSTR command); [id(3), helpstring("method create")] HRESULT create([in] LONG clientId, [in] BSTR command); [id(4), helpstring("method insert")] HRESULT insert([in] LONG clientId, [in] BSTR command); [id(5), helpstring("method select")] HRESULT select([in] LONG clientId, [in] BSTR command, [out] BSTR* result, [out] LONG* colCnt); [id(6), helpstring("method drop")] HRESULT drop([in] LONG clientId, [in] BSTR command); }; typedef enum MY_DEFINES { MY_DEFINE1 = 1, MY_DEFINE2 = 2, }MY_DEFINES;
dann sollte es auf jeden fall gehen.
-
hallo.
tut mir leid,
durch die herausnahme des enums aus der interface-definition funktioniert es leider auch nicht. Beim Aufruf von ICOMMyDB. erscheint nur "Equals" und "ReferenceEquals".