将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 ++构建环境中不存在这样的预处理器定义。

请注意,这只会确保两个零件在构建时都已同步化。如果我们混合并匹配来自不同版本的二进制文件,则保证将失败。