español enumeraciones enum c# c++

español - Importación de enumeraciones de C++ en C#



enum class c# (4)

Actualmente estoy trabajando en la creación de un nuevo proyecto C # que necesita interactuar con una aplicación C ++ más antigua. Hay una enumeración de error que ya existe en la aplicación C ++ que necesito usar en la aplicación C #.

No quiero volver a declarar la enumeración en C # porque podría causar problemas de sincronización en el futuro si los archivos no se actualizan juntos .

Dicho todo esto, mi pregunta es la siguiente: ¿Hay alguna forma de que tome una enumeración declarada así:

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

y usarlo en un programa C # como ese:

eDeviceIntErrCodes.eDEVICEINT_ERR_FATAL


Consulte la herramienta Asistente de interoperabilidad de Invoke http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120 . Es una herramienta útil para generar firmas PInvoke para métodos nativos.

Si le doy tu enum genera este código. Hay una versión de línea de comandos de la herramienta incluida, por lo que podría crear un proceso automatizado para mantener actualizada la definición de Cúo de la enumeración siempre que cambie la versión de C ++.

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


En C / C ++, puede #incluir un archivo .cs que contenga la definición de enumeración. El uso cuidadoso de las directivas de preprocesador se encarga de las diferencias de sintaxis entre C # y C.

Ejemplo:

#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

En su proyecto de C #, establezca un símbolo de compilación condicional "CSharp", asegúrese de que no exista dicha definición de preprocesador en el entorno de compilación de C / C ++.

Tenga en cuenta que esto solo garantizará que ambas partes estén sincronizadas en el momento de la construcción. Si mezcla binarios de diferentes compilaciones, la garantía falla.


La respuesta simple será el no. Lo siento, vas a tener que volver a declarar.

Sin embargo, en el pasado escribí guiones para importar mis enums de C ++ a un formato C # en un archivo enums.cs y ejecutarlo como parte de la compilación, de esa manera todo se sincroniza.


Si hubiera declarado la enumeración como:

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

y en otro archivo:

DEVICE_ERR_CODES eDeviceIntErrCodes;

y llamado el archivo enum con una extensión .cs, es posible que pueda hacer que funcione. Lo harías referencia como:

DEVICE_ERR_CODES err = DEVICE_ERR_CODES.eDEVICEINT_ERR_FATAL;