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?

È stato utile?

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,

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top