有没有办法在本机(非托管)C ++和(托管)C#之间共享枚举定义?
我在完全非托管代码中使用了以下枚举:
enum MyEnum { myVal1, myVal2 };
我们的应用程序有时会使用托管组件。该C#组件通过托管C ++ interop dll(来自本机dll)获取枚举项值为int。 (只有在需要C#组件时才会加载interop dll。)C#组件重复了枚举定义:
public enum MyEnum { myVal1, myVal2 };
有没有办法在不将原生C ++ dll转换为托管dll的情况下消除重复?
答案 0 :(得分:17)
您可以使用单个.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
答案 1 :(得分:4)
感谢分享!
我玩了一下,找到了一种方法,可以有多个枚举和常量声明,而不需要额外的大量行:)
// 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
答案 2 :(得分:3)
您可以将C#库公开给COM,然后将类型库导入非托管代码 - 这样您就可以使用非托管库中C#库中定义的枚举。
答案 3 :(得分:0)
非托管C ++和C#存在两个不同的世界,所以没有办法使用相同的枚举,而不将c ++ DLL更改为托管的。
即便如此,您可能还需要托管C ++ DLL中的复制。
C ++枚举非常类似于常量列表,而C#枚举继承了Enum类,因此提供了相当多的“技巧”。所以你可以看到,他们非常不同。
如果本机C ++ DLL是本机的还是托管的并不重要,我会把它变成托管的并将本机调用包装在托管的C ++层中。
这样你就可以在C ++ DLL中进行枚举复制,同时也可以同时删除所有的互操作: - )
答案 4 :(得分:0)
我过去遇到了同样的问题,并使用预处理程序定义解决了这个问题。
在非托管代码中,在托管包装器中也可以包含的标头内,将枚举项放入#define。
然后,在托管和非托管枚举定义中,对两种用法使用相同的#define。
托管和非托管世界之间的枚举运动看起来有点令人讨厌(基本上需要强制转换),但对于未管理世界中的呼叫者,它看起来和感觉都很好。
祝你好运,