簡體   English   中英

將C ++枚舉導入C#

[英]Importing C++ enumerations into C#

我目前正在創建一個需要與舊的C ++應用程序交互的新C#項目。 我需要在C#應用程序中使用C ++應用程序中存在的錯誤枚舉。

我不想在C#中重新聲明枚舉,因為如果文件沒有一起更新,這可能會導致同步問題

所有這一切都說我的問題是:有沒有辦法讓我采用如此聲明的枚舉:

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

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

eDeviceIntErrCodes.eDEVICEINT_ERR_FATAL

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

在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 ++構建環境中不存在這樣的預處理器定義。

請注意,這只會確保兩個部分在構建時同步。 如果混合並匹配來自不同構建的二進制文件,則保證將失敗。

簡單的答案是否定的。 對不起,您將不得不重新申報。

在過去,我有編寫腳本來將我的C ++枚舉導入到enums.cs文件中的C#格式,並將其作為構建的一部分運行,這樣一切都會同步。

如果你已經宣布枚舉如下:

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;

如果在C ++ / CLI中定義強枚舉,則枚舉代碼將包含在dll元數據中。 因此,您可以在C#中使用枚舉代碼。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM