将C ++枚举导入C#

我目前正在创建一个需要与旧的C ++应用程序交互的新C#项目。 我需要在C#应用程序中使用C ++应用程序中存在的错误枚举。

我不想在C#中重新声明枚举,因为如果文件没有一起更新,可能会导致同步问题

所有这一切都说明了我的问题:有没有办法让我采用如此声明的枚举:

typedef enum { eDEVICEINT_ERR_FATAL = 0x10001 ... } eDeviceIntErrCodes; 

并在C#程序中使用它,如下所示:

 eDeviceIntErrCodes.eDEVICEINT_ERR_FATAL 

查看PInvoke Interop Assistant工具http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120 。 它是为本机方法生成PInvoke签名的有用工具。

如果我将它给你的枚举它生成这个代码。 包含该工具的命令行版本,因此您可以构建一个自动化过程,以便在C ++版本更改时使枚举的C#定义保持最新。

 public enum eDeviceIntErrCodes { /// eDEVICEINT_ERR_FATAL -> 0x10001 eDEVICEINT_ERR_FATAL = 65537, } 

在C / C ++中,您可以#include包含枚举定义的.cs文件。 仔细使用预处理程序指令会处理C#和C之间的语法差异。

例:

 #if CSharp namespace MyNamespace.SharedEnumerations { public #endif enum MyFirstEnumeration { Autodetect = -1, Windows2000, WindowsXP, WindowsVista, OSX, Linux, // Count must be last entry - is used to determine number of items in the enum Count }; #if CSharp public #endif enum MessageLevel { None, // Message is ignored InfoMessage, // Message is written to info port. InfoWarning, // Message is written to info port and warning is issued Popup // User is alerted to the message }; #if CSharp public delegate void MessageEventHandler(MessageLevel level, string message); } #endif 

在C#项目中,设置条件编译符号“CSharp”,确保C / C ++构建环境中不存在这样的预处理器定义。

请注意,这只会确保两个部分在构建时同步。 如果混合并匹配来自不同构建的二进制文件,则保证将失败。

简单的答案是否定的。 对不起,您将不得不重新申报。

在过去,我有编写脚本来将我的C ++枚举导入到enums.cs文件中的C#格式,并将其作为构建的一部分运行,这样一切都会同步。

如果你已经宣布枚举如下:

 namespace blah { enum DEVICE_ERR_CODES { eDEVICEINT_ERR_FATAL = 0x10001, eDEVICEINT_ERR_OTHER = 0x10002, }; } 

在另一个文件中:

 DEVICE_ERR_CODES eDeviceIntErrCodes; 

并命名具有.cs扩展名的枚举文件,您可能能够使其工作。 你会像它一样引用它:

 DEVICE_ERR_CODES err = DEVICE_ERR_CODES.eDEVICEINT_ERR_FATAL; 

如果在C ++ / CLI中定义强枚举,则枚举代码将包含在dll元数据中。 因此,您可以在C#中使用枚举代码。

 public enum class eDeviceIntErrCodes: int { eDEVICEINT_ERR_FATAL = 0x10001 ... };