Можно ли разделить объявление перечисления между C# и неуправляемым c++?

есть ли способ поделиться определением перечисления между родным (неуправляемым) C++ и (управляемым) C#?

у меня есть следующее перечисление, используемое в полностью неуправляемом коде:

enum MyEnum { myVal1, myVal2 };

наше приложение иногда использует управляемый компонент. Этот компонент C# получает значения элементов перечисления как ints через управляемую библиотеку DLL взаимодействия C++ (из собственной библиотеки dll). (Библиотека DLL взаимодействия загружается только при необходимости компонента C#.) Компонент C# дублировал перечисление определение:

public enum MyEnum { myVal1, myVal2 };

есть ли способ устранить дублирование, не превращая собственную dll C++ в управляемую dll?

5 ответов


вы можете использовать один .cs-файл и поделиться им между обоими проектами. #include В C++ на a .cs-файл не должен быть проблемой.

Это был бы пример .cs файл:

#if !__LINE__    
namespace MyNamespace
{
    public 
#endif

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

#if !__LINE__
}
#endif

Если вы хотите несколько перечислений в одном файле, вы можете сделать это (хотя вам нужно временно определить public, чтобы быть ничем для 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

Спасибо за обмен!

Я немного поиграл и нашел способ иметь несколько перечислений и постоянных объявлений без тонны дополнительных строк:)

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

Не забудьте назвать свой файл *.cs


вы можете предоставить библиотеку C# COM, а затем импортировать библиотеку типов в неуправляемый код - таким образом, вы сможете использовать перечисление, определенное в библиотеке C# в неуправляемой библиотеке.


неуправляемые C++ и c# живут в двух разных мирах, поэтому нет никакого способа использовать одно и то же перечисление, не изменяя DLL C++ в управляемый.

и даже тогда вам, вероятно, понадобится дублирование в управляемой DLL C++.

перечисление C++ очень похоже на список констант, тогда как перечисление C# наследует класс Enum и, таким образом, предоставляет довольно много "трюков". Так что, как вы можете видеть, они очень разные.

Если это не имеет значения, собственная DLL C++ является родной или управляемой, я бы превратил ее в управляемую и обернул собственные вызовы внутри управляемого слоя C++.

таким образом, вы можете иметь дублирование перечисления внутри библиотеки DLL C++, а также вы можете избавиться от всех взаимодействий одновременно :-)


У меня была такая же проблема в прошлом и решить ее с помощью определений препроцессора.

в неуправляемом коде внутри заголовка, который также может быть включен в управляемую оболочку, поместите элементы перечисления в #define.

затем в определениях управляемого и неуправляемого перечисления используйте один и тот же #define для обоих способов использования.

движение перечислений между управляемым и неуправляемым миром выглядит немного неприятно (в основном бросок необходимо), но для вашего абонента в неуправляемом мире это будет выглядеть и чувствовать себя хорошо.

удачи,