19

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

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

enum MyEnum { myVal1, myVal2 };

我们的应用程序有时会使用托管组件。该 C# 组件通过托管 C++ 互操作 dll(来自本机 dll)将枚举项值作为整数获取。(互操作 dll 仅在需要 C# 组件时才加载。)C# 组件复制了枚举定义:

public enum MyEnum { myVal1, myVal2 };

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

4

5 回答 5

19

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

这将是一个示例 .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
于 2009-06-05T16:51:47.830 回答
5

感谢分享!

我玩了一下,找到了一种方法来拥有多个枚举和常量声明,而无需大量额外的行:)

// 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

于 2012-04-23T18:24:07.710 回答
3

您可以将 C# 库公开给 COM,然后将类型库导入非托管代码 - 这样您就可以在非托管库中使用 C# 库中定义的枚举。

于 2009-06-05T05:28:44.410 回答
0

非托管 C++ 和 C# 生活在两个不同的世界中,因此没有办法使用相同的枚举,而无需将 c++ DLL 更改为托管的。

即使这样,您也可能需要托管 C++ DLL 中的副本。

C++ 枚举很像一个常量列表,而 C# 枚举继承了 Enum 类,因此提供了很多“技巧”。如您所见,它们非常不同。

如果本机 C++ DLL 是本机还是托管无关紧要,我会将其变成托管的,并将本机调用包装在托管 C++ 层中。

这样您就可以在 C++ DLL 中进行枚举复制,并且您可以同时摆脱所有互操作 :-)

于 2009-06-05T05:03:05.817 回答
0

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

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

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

托管和非托管世界之间的枚举移动看起来有点讨厌(基本上需要演员表),但对于非托管世界中的调用者来说,它看起来和感觉都很好。

祝你好运,

于 2009-06-05T09:14:40.660 回答