Importazione di enumerazioni C++ in C#


14

Attualmente sto lavorando alla creazione di un nuovo progetto C# che deve interagire con un'applicazione C++ precedente. Esiste un'enumerazione degli errori già esistente nell'app C++ che devo utilizzare nell'app C#.

Non voglio solo dichiarare nuovamente l'enumerazione in C# perché ciò potrebbe causare problemi di sincronizzazione lungo la linea se i file non vengono aggiornati insieme.

Detto questo la mia domanda è questa: C'è un modo per me di prendere un'enumerazione dichiarato in questo modo:

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

e utilizzarlo in un programma C# in questo modo:

eDeviceIntErrCodes.eDEVICEINT_ERR_FATAL 
12

Controllare lo strumento PInvoke Interop Assistant http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120. È uno strumento utile per generare firme PInvoke per i metodi nativi.

Se lo nutro, l'enumerazione genera questo codice. Esiste una versione a riga di comando dello strumento incluso in modo da poter potenzialmente creare un processo automatizzato per mantenere aggiornata la definizione C# dell'enum ogni volta che la versione C++ cambia.


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

2

La risposta semplice sarà no. Siamo spiacenti, dovrai dichiarare nuovamente.

Ho, in passato, script scritti per importare le mie encezioni C++ in un formato C# in un file enums.cs ed eseguirlo come parte della compilazione, in questo modo tutto sincronizza.


0

Se tu avessi dichiarato l'enum come:

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

e in un altro file:

DEVICE_ERR_CODES eDeviceIntErrCodes;

e nominato il file enum con estensione cs, si potrebbe essere in grado di farlo funzionare. Faresti riferimento a esso come:

DEVICE_ERR_CODES err = DEVICE_ERR_CODES.eDEVICEINT_ERR_FATAL;

12

In C/C++ è possibile # include un file con estensione cs, che contiene la definizione di enumerazione. uso attento delle direttive del preprocessore si prende cura delle differenze di sintassi tra C# e C.

Esempio:

#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 

Nel progetto C#, impostare un simbolo di compilazione condizionale "CSharp", assicurarsi che esista tale definizione del preprocessore nell'ambiente di compilazione C/C++.

Si noti che ciò garantisce che entrambe le parti siano sincronizzate al momento della compilazione. Se si mischiano i binari di diverse build, la garanzia fallisce.