我目前正在创建一个新的C#项目,该项目需要与较旧的C应用程序进行交互。我需要在C#应用程序中使用的C应用程序中已经存在错误枚举。
我不想只用C#重新声明枚举,因为如果文件没有一起更新,可能会导致同步问题。
所有我所说的是这个问题:
我有没有办法采用这样声明的枚举:
1 2 3 4 5
| typedef enum
{
eDEVICEINT_ERR_FATAL = 0x10001
...
} eDeviceIntErrCodes; |
并在C#程序中使用它,如下所示:
1
| eDeviceIntErrCodes.eDEVICEINT_ERR_FATAL |
在C / C中,您可以#include一个包含枚举定义的.cs文件。谨慎使用预处理程序指令可解决C#和C之间的语法差异。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #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构建环境中不存在这样的预处理器定义。
请注意,这只会确保两个部件在构建时都已同步。如果您混合并匹配来自不同内部版本的二进制文件,则保证将失败。
签出PInvoke Interop Assistant工具http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120。它是为本地方法生成PInvoke签名的有用工具。
如果我将其提供给您的枚举,它将生成此代码。该工具包含一个命令行版本,因此您可以潜在地构建一个自动过程,以在C版本更改时使该枚举的C#定义保持最新。
1 2 3 4 5
| public enum eDeviceIntErrCodes
{
/// eDEVICEINT_ERR_FATAL -> 0x10001
eDEVICEINT_ERR_FATAL = 65537,
} |
简单的答案将不会。抱歉,您将不得不重新声明。
但是,我过去曾经编写脚本,将我的C枚举导入到enums.cs文件中的C#格式,并作为构建的一部分运行它,这样所有内容都可以同步。
如果在C / CLI中定义强枚举,则枚举代码将包含在dll元数据中。因此,您可以在C#中使用枚举代码。
1 2 3 4 5
| public enum class eDeviceIntErrCodes: int
{
eDEVICEINT_ERR_FATAL = 0x10001
...
}; |
如果您已声明枚举,例如:
1 2 3 4 5 6 7 8
| namespace blah
{
enum DEVICE_ERR_CODES
{
eDEVICEINT_ERR_FATAL = 0x10001,
eDEVICEINT_ERR_OTHER = 0x10002,
};
} |
和另一个文件中的:
1
| DEVICE_ERR_CODES eDeviceIntErrCodes; |
并以.cs扩展名命名该枚举文件,您也许可以使它正常工作。
您可以像这样引用它:
1
| DEVICE_ERR_CODES err = DEVICE_ERR_CODES.eDEVICEINT_ERR_FATAL; |