Importieren von C++ - Enumerationen in C#


14

Ich arbeite derzeit an dem Erstellen eines neuen C# -Projekts, das mit einer älteren C++ - Anwendung interagieren muss. Es gibt eine Fehleraufzählung, die bereits in der C++ - App vorhanden ist, die ich in der C# -App verwenden muss.

Ich möchte nicht nur die Aufzählung in C# deklarieren, da dies zu Synchronisierungsproblemen führen kann, wenn die Dateien nicht gemeinsam aktualisiert werden.

, dass alle gesagt meine Frage ist: Gibt es eine Möglichkeit für mich genommen eine Aufzählung wie so erklärt:

typedef enum 
{ 
    eDEVICEINT_ERR_FATAL = 0x10001 
    ... 
} eDeviceIntErrCodes; 

und in einem C# Programm wie so verwenden:

eDeviceIntErrCodes.eDEVICEINT_ERR_FATAL 
12

Überprüfen Sie das PInvoke Interop Assistant Tool http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120. Es ist ein nützliches Werkzeug zum Erzeugen von PInvoke-Signaturen für native Methoden.

Wenn ich es Ihre enum füttere erzeugt es diesen Code. Es ist eine Befehlszeilenversion des Tools enthalten, so dass Sie möglicherweise einen automatisierten Prozess erstellen können, um die C# -Definition der Enumeration bei jeder Änderung der C++ - Version auf dem neuesten Stand zu halten.


    public enum eDeviceIntErrCodes 
    { 
     /// eDEVICEINT_ERR_FATAL -> 0x10001 
     eDEVICEINT_ERR_FATAL = 65537, 
    } 

2

Einfache Antwort wird nein sein. Entschuldigung, Sie müssen erneut deklarieren.

Ich habe in der Vergangenheit jedoch Skripte geschrieben, um meine C++ - Enums in ein C# -Format in einer enums.cs-Datei zu importieren und als Teil des Builds auszuführen, so dass alles synchronisiert wird.


0

Wenn Sie die Enum wie erklärt hatten:

namespace blah 
{ 
    enum DEVICE_ERR_CODES 
    { 
     eDEVICEINT_ERR_FATAL = 0x10001, 
     eDEVICEINT_ERR_OTHER = 0x10002, 
    }; 
}

und in einer anderen Datei:

DEVICE_ERR_CODES eDeviceIntErrCodes;

und die Enum-Datei mit einer CS- Erweiterung mit dem Namen, könnten Sie in der Lage sein, Mach es zur Arbeit. Sie würden darauf verweisen mag:

DEVICE_ERR_CODES err = DEVICE_ERR_CODES.eDEVICEINT_ERR_FATAL;

12

In C/C++ Sie eine CS-Datei # include kann, die die Aufzählungsdefinition enthält. Eine sorgfältige Verwendung von Präprozessordirektiven Pflege der Syntax Unterschiede zwischen C# und C

Beispiel nimmt:

#if CSharp 
namespace MyNamespace.SharedEnumerations 
{ 
public 
#endif 


enum MyFirstEnumeration 
{ 
    Autodetect = -1, 
    Windows2000, 
    WindowsXP, 
    WindowsVista, 
    OSX, 
    Linux, 

    // Count must be last entry - is used to determine number of items in the enum 
    Count 
}; 
#if CSharp 
public 
#endif 

enum MessageLevel 
{ 
    None,   // Message is ignored 
    InfoMessage, // Message is written to info port. 
    InfoWarning, // Message is written to info port and warning is issued 
    Popup   // User is alerted to the message 
}; 

#if CSharp 
    public delegate void MessageEventHandler(MessageLevel level, string message); 
} 
#endif 

In Ihrem C# Projekt, das Symbol „CSharp“ eine bedingte Kompilierung, stellen Sie sicher, dass keine solche Präprozessordefinition existiert in der C/C++ Build-Umgebung.

Beachten Sie, dass dadurch nur sichergestellt wird, dass beide Teile zum Zeitpunkt der Erstellung synchronisiert werden. Wenn Sie Binärdateien verschiedener Builds mischen und abgleichen, schlägt die Garantie fehl.