E 'possibile condividere una dichiarazione enum tra C # e C ++ non gestito?
Domanda
C'è un modo per condividere una definizione di enum tra nativo (non gestito) C ++ e (gestito) C #?
Ho il seguente enum utilizzato nel codice non gestito completamente:
enum MyEnum { myVal1, myVal2 };
La nostra applicazione a volte usa un componente gestito. Tale componente C # ottiene i valori degli elementi enum come interi attraverso un C ++ interoperabilità DLL gestita (dal dll nativa). (La dll di interoperabilità solo carichi se è necessario il componente C #.) Il componente C # ha duplicato la definizione enum:
public enum MyEnum { myVal1, myVal2 };
C'è un modo per eliminare la duplicazione senza girare il nativo C ++ DLL in una DLL gestita?
Soluzione
È possibile utilizzare un singolo file con estensione cs e condividerlo tra i due progetti. #include
in C ++ su un file con estensione cs dovrebbe essere un problema.
Questo sarebbe un esempio di file .cs:
#if !__LINE__
namespace MyNamespace
{
public
#endif
// shared enum for both C, C++ and C#
enum MyEnum { myVal1, myVal2 };
#if !__LINE__
}
#endif
Se si desidera che più enumerazioni in un unico file, è possibile farlo (anche se bisogna definire temporaneamente pubblico di essere nulla per C / C ++):
#if __LINE__
#define public
#else
namespace MyNamespace
{
#endif
public enum MyEnum { MyEnumValue1, MyEnumValue2 };
public enum MyEnum2 { MyEnum2Value1, MyEnum2Value2 };
public enum MyEnum3 { MyEnum3Value1, MyEnum3Value2 };
#if __LINE__
#undef public
#else
}
#endif
Altri suggerimenti
Grazie per la condivisione!
Ho suonato in giro un po 'e ha trovato un modo per avere enum multipla e dichiarazioni di costanti senza avere tonnellate di linee extra:)
// This is a valid C, C++ and C# file :)
#if __LINE__
#define public
#else
namespace MyCSharpNamespace{
#endif
public enum MyConstant { MaxStr = 256 };
public enum MyEnum1{ MyEnum1_A, MyEnum1_B };
public enum MyEnum2{ MyEnum2_A, MyEnum2_B };
#if __LINE__
#undef public
#else
}
#endif
Ricordate di un nome al file * .cs
È possibile esporre la libreria C # per COM e quindi importare la libreria dei tipi nel codice non gestito - in questo modo si sarà in grado di utilizzare l'enum definito nella libreria C # nella biblioteca non gestito
.non gestito C ++ e C # vivono in due mondi diversi, quindi non v'è alcun modo di usare la stessa enum, senza cambiare il c ++ DLL in un gestito uno.
E anche allora, si sarebbe probabilmente necessario il duplicazioni nella DLL gestita C ++.
A C ++ enum è molto simile a un elenco di costanti, mentre un C # enum eredita la classe Enum e, quindi, fornisce un bel paio di "trucchi". Così come si può vedere, sono molto diverso.
Se non importa se l'++ DLL native C è nativo o gestito, mi piacerebbe trasformarla in una gestito uno e avvolgere il chiamate native all'interno di un layer gestita C ++.
In questo modo si può avere la duplicazione enum all'interno del ++ DLL C, e anche si può sbarazzarsi di tutta l'interoperabilità, allo stesso tempo: -)
Ho avuto lo stesso problema in passato e risolto utilizzando le definizioni del preprocessore.
Nel codice non gestito, all'interno di un colpo di testa che può anche essere incluso per il vostro wrapper gestito, posizionare i tuoi oggetti di enumerazione in un #define.
Poi, nelle definizioni gestiti e non gestiti enumerazione, utilizzare lo stesso # define per entrambi gli usi.
Il movimento delle enumerazioni tra il mondo gestiti e non gestiti sembra un po 'brutto (è necessaria fondamentalmente un cast), ma per il chiamante nel mondo non gestito, che sarà guardare e sentire bene.
In bocca al lupo,