2008-08-20 96 views
14

我目前正在創建一個新的C#項目,該項目需要與舊的C++應用程序進行交互。在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++構建環境中。

請注意,這將只確保兩個部件在構建時同步。如果您混合使用不同版本的二進制文件,則保證失敗。