是否可以在C#和非托管C ++之间共享枚举声明?

有没有办法在本机(非托管)C ++和(托管)C#之间共享枚举定义?

我在完全非托管代码中使用以下枚举:

enum MyEnum { myVal1, myVal2 }; 

我们的应用程序有时使用托管组件。 该C#组件通过托管C ++ interop dll(来自本机dll)获取枚举项值为int。 (只有在需要C#组件时才会加载interop dll。)C#组件重复了枚举定义:

 public enum MyEnum { myVal1, myVal2 }; 

有没有办法消除重复,而无需将原生C ++ DLL转换为托管dll?

您可以使用单个.cs文件并在两个项目之间共享它。 在.cs文件中使用C ++中的#include应该没问题。

这将是一个示例.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#存在于两个不同的世界中,因此没有办法使用相同的枚举,而无需将c ++ DLL更改为托管DLL。

即便如此,您可能还需要托管C ++ DLL中的重复。

C ++枚举非常类似于常量列表,而C#枚举inheritance了Enum类,因此提供了相当多的“技巧”。 你可以看到,他们是非常不同的。

如果本机C ++ DLL是本机的还是托管的并不重要,我会将其转换为托管的并将本机调用包装在托管C ++层中。

这样你就可以在C ++ DLL里面进行枚举复制,同时你也可以同时摆脱所有的互操作:-)

我过去遇到了同样的问题,并使用预处理器定义解决了它。

在非托管代码中,在托管包装器中也可以包含的标头内,将枚举项放入#define。

然后,在托管和非托管枚举定义中,对两个用法使用相同的#define。

托管和非托管世界之间的枚举运动看起来有点令人讨厌(基本上需要强制转换),但对于未管理世界中的呼叫者,它看起来和感觉都很好。

祝好运,