*.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.
    IDL

    typedef 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".


Anmelden zum Antworten