当前位置:  开发笔记 > 编程语言 > 正文

将C++枚举导入C#

如何解决《将C++枚举导入C#》经验,为你挑选了2个好方法。

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

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

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

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

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

eDeviceIntErrCodes.eDEVICEINT_ERR_FATAL

Brian Ensink.. 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,
    }


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

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



1> Brian Ensink..:

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



2> Rob..:

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

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

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有