是否有共享本机(非托管)C ++和(管理)C#?

之间的枚举定义的方式

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

enum MyEnum { myVal1, myVal2 };

我们的应用有时使用一个被管理单元。该C#组件获得的枚举项值作为经由托管C互操作的DLL整数(从天然DLL)。 (该互操作DLL仅当C#部件需要的负荷。)中的C#组件已复制的枚举定义:

public enum MyEnum { myVal1, myVal2 };

是否有以消除重复无需转动天然C ++ DLL到托管DLL的方法吗?

有帮助吗?

解决方案

您可以使用一个cs文件和这两个项目之间共享。 #include在C ++上的cs文件应该没有问题。

这将是一个例子cs文件:

#if !__LINE__    
namespace MyNamespace
{
    public 
#endif

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

#if !__LINE__
}
#endif

如果你想在一个文件中的多个枚举,你可以做到这一点(虽然你必须暂时界定公共是没有什么的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到一个管理的一个。

即使这样,你可能需要在托管C ++ DLL重复。

一个C ++枚举很像常数的列表,而C#枚举继承Enum类,并因此提供相当多的“技巧”。所以你可以看到,他们的非常的不同。

如果不要紧本地C ++ DLL是否是天然的或管理的,我把它变成管理的一个和一个包裹管理C ++层内部的本机的呼叫。

这样,你可以有C ++ DLL中枚举的重复,也可以同时破除一切互操作的: - )

我已经在过去同样的问题,使用预处理器定义解决它。

在非托管代码,这也可以由您的托管的包装包括一个集管内,请将枚举项放入的#define。

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

托管和非托管世界之间的枚举的运动看起来稍微讨厌(需要基本上是投),但在不可控制的世界呼叫方,它会看起来和感觉很好。

好运,

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top