是否可以在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。
托管和非托管世界之间的枚举运动看起来有点令人讨厌(基本上需要强制转换),但对于未管理世界中的呼叫者,它看起来和感觉都很好。
祝好运,