将C ++枚举导入C#
时间:2020-03-05 18:41:17 来源:igfitidea点击:
我目前正在创建一个新的Cproject,该项目需要与旧的C ++应用程序进行交互。我需要在Capp中使用的C ++应用程序中已经存在一个错误枚举。
我不想在C中重新声明枚举,因为如果文件没有一起更新,可能会导致同步问题。
我所说的只是这个问题:
我有没有办法采用这样声明的枚举:
typedef enum { eDEVICEINT_ERR_FATAL = 0x10001 ... } eDeviceIntErrCodes;
并在Cprogram中使用它,如下所示:
eDeviceIntErrCodes.eDEVICEINT_ERR_FATAL
解决方案
回答
简单的答案将不会。抱歉,我们需要重新声明。
但是,我过去曾经编写过脚本,将我的C ++枚举导入到enums.cs文件中的Cformat中,并在构建过程中运行它,从而使所有内容同步。
回答
检出PInvoke Interop Assistant工具http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120。它是为本地方法生成PInvoke签名的有用工具。
如果我将其提供给枚举,它将生成此代码。该工具包含一个命令行版本,因此我们可以构建一个自动过程,以在C ++版本更改时使枚举的Cdefinition保持最新。
public enum eDeviceIntErrCodes { /// eDEVICEINT_ERR_FATAL -> 0x10001 eDEVICEINT_ERR_FATAL = 65537, }
回答
如果我们将枚举声明为:
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 / C ++中,我们可以#include一个包含枚举定义的.cs文件。谨慎使用预处理程序指令可解决Cand 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
在Cproject中,设置条件编译符号" CSharp",确保在C / C ++构建环境中不存在这样的预处理器定义。
请注意,这只会确保两个零件在构建时都已同步化。如果我们混合并匹配来自不同版本的二进制文件,则保证将失败。