将C++枚举导入C#


14

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

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

之所以这么说,我的问题是这样的: 有没有办法对我来说,迈出了枚举中声明,如下所示:

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

,并用它在C#程序像这样:

eDeviceIntErrCodes.eDEVICEINT_ERR_FATAL 
12

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

如果我为它生成枚举,它会生成此代码。有一个包含该工具的命令行版本,因此您可以构建一个自动化进程,以便C++版本更改时保持Enum的C#定义更新。


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

2

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

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


0

如果你已经宣布像枚举:

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;

12

在C/C++,你可以#包括其中包含枚举定义一个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++构建环境中。

请注意,这将只确保两个部件在构建时同步。如果您混合使用不同版本的二进制文件,则保证失败。