Pregunta

¿Hay una manera de compartir una definición de enumeración entre nativo (no administrado) C ++ y (administrado) C #?

Tengo el siguiente enumeración se utiliza en código no administrado por completo:

enum MyEnum { myVal1, myVal2 };

Nuestra aplicación utiliza a veces un componente administrado. Ese componente C # obtiene los valores de los elementos de enumeración como enteros a través de un archivo DLL de C ++ administrado de interoperabilidad (desde el archivo DLL nativo). (El DLL de interoperabilidad sólo carga si se necesita el componente C #.) El componente C # se ha duplicado la definición de enumeración:

public enum MyEnum { myVal1, myVal2 };

¿Hay una manera de eliminar la duplicación sin convertir el C ++ nativo DLL en una DLL administrada?

¿Fue útil?

Solución

Puede utilizar un archivo .cs individuales y compartirlo entre ambos proyectos. #include en C ++ en un archivo .cs debería haber ningún problema.

Esto sería un ejemplo de archivo .cs:

#if !__LINE__    
namespace MyNamespace
{
    public 
#endif

// shared enum for both C, C++ and C#
enum MyEnum { myVal1, myVal2 };

#if !__LINE__
}
#endif

Si desea varias enumeraciones en un archivo, se puede hacer esto (aunque hay que definir temporalmente público a ser nada para 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

Otros consejos

Gracias por compartir!

Me jugado un poco y encontró una manera de tener enumeración múltiple y declaraciones de constantes sin tener toneladas de líneas adicionales:)

// 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

Recuerde que debe nombrar sus archivos * .cs

Puede exponer el C # biblioteca para COM y luego importar la biblioteca de tipos en el código no administrado - de esta manera usted será capaz de utilizar la enumeración se define en la biblioteca de C # en la biblioteca no administrado

.

No administrado C ++ y C # viven en dos mundos diferentes, por lo que no hay ninguna manera de utilizar la misma enumeración, sin cambiar el C ++ DLL en un logrado uno.

Y aun así, es probable que necesitaría la duplicación en la DLL administrada C ++.

A C ++ enumeración es muy parecido a una lista de constantes, mientras que una enumeración de C # hereda la clase Enum, y por lo tanto proporciona un buen número de "trucos". Así como se puede ver, son muy diferente.

Si no importa si el nativo de C ++ DLL es nativa o administrado, me convierto en un logrado uno y envolver las llamadas nativas dentro de una capa manejado C ++.

De este modo puede tener la duplicación de enumeración dentro de la DLL de C ++, y también puede deshacerse de toda la interoperabilidad al mismo tiempo: -)

He tenido el mismo problema en el pasado y lo resolvió utilizando las definiciones del preprocesador.

En el código no administrado, dentro de un encabezado que también puede ser incluido por el contenedor administrado, coloque los elementos de enumeración en un #define.

A continuación, en sus definiciones de enumeración administrados y no administrados, utilice el mismo # define para ambos usos.?

El movimiento de las enumeraciones entre el mundo administrado y no administrado se ve un poco desagradable (se necesita básicamente un elenco), pero con su interlocutor en el mundo no administrado, que va a verse y sentirse bien.

Buena suerte,

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top