将C ++枚举导入C#

时间:2008-08-20 20:39:37

标签: c# c++

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

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

所有这些都说我的问题是这样的: 有没有办法让我采用这样的枚举:

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

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

eDeviceIntErrCodes.eDEVICEINT_ERR_FATAL

5 个答案:

答案 0 :(得分:12)

查看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,
    }

答案 1 :(得分:12)

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

如果您已将枚举声明为:

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

并在另一个档案中:

DEVICE_ERR_CODES eDeviceIntErrCodes;

并使用.cs扩展名命名enum文件,您或许可以使其工作。 你可以参考它:

DEVICE_ERR_CODES err = DEVICE_ERR_CODES.eDEVICEINT_ERR_FATAL;

答案 4 :(得分:0)

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

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