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

时间:2009-06-05 04:55:29

标签: c# c++ enums native managed

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

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

enum MyEnum { myVal1, myVal2 };

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

public enum MyEnum { myVal1, myVal2 };

有没有办法在不将原生C ++ dll转换为托管dll的情况下消除重复?

5 个答案:

答案 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。

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

祝你好运,