Importación de enumeraciones C++ en C#


14

Actualmente estoy trabajando en la creación de un nuevo proyecto C# que necesita interactuar con una aplicación C++ anterior. 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 si los archivos no se actualizan juntos.

dicho todo esto mi pregunta es la siguiente: ¿Hay alguna forma para mí tomado una enumeración declarado así:

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

y utilizarlo en un programa en C#, así:

eDeviceIntErrCodes.eDEVICEINT_ERR_FATAL 
12

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

Si lo publico en su 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, 
    } 

2

Respuesta simple va a ser no. Lo siento, vas a tener que volver a declarar.

En el pasado, sin embargo, he escrito 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.


0

Si se 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 el nombre del archivo de enumeración con una extensión .cs, usted podría ser capaz de haz que funcione Te referencia a él como:

DEVICE_ERR_CODES err = DEVICE_ERR_CODES.eDEVICEINT_ERR_FATAL;

12

En C/C++ se puede utilizar #include un archivo .cs que contiene 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#, un juego de símbolos de compilación condicional "CSharp", asegúrese de que existe tal definición de preprocesador en el entorno de compilación 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.