在C#中编组DWORD为long还是int?

时间:2017-10-16 10:04:05

标签: c# struct pinvoke dword

我在我的C#应用​​程序中调用了SetServiceStatus。微软的实施决定了DWORD components of SERVICE_STATUS struct are Marshalled as long (Int64) rather than int.

我知道这些需要是无符号的(但是CLS不允许使用无符号类型),所以我想知道微软是否建议使用long而不是int来绕过未签名的CLS问题?

另外,唠叨我说DWORD是32位且长(C#)的东西是64位,但微软的例子说结构要声明为顺序布局,所以我不明白这是如何工作的(确认在我的机器上工作)

2 个答案:

答案 0 :(得分:1)

那篇文章错了。这些字段应为uint或perhals int,具体取决于您的偏好。正确地指出C#中的long是64位类型。

答案 1 :(得分:-1)

我想我是对的;我已经改变了很长时间,一切都很顺利。

枚举和结构应如下所示。

public enum ServiceState
{
SERVICE_STOPPED = 0x00000001,
SERVICE_START_PENDING = 0x00000002,
SERVICE_STOP_PENDING = 0x00000003,
SERVICE_RUNNING = 0x00000004,
SERVICE_CONTINUE_PENDING = 0x00000005,
SERVICE_PAUSE_PENDING = 0x00000006,
SERVICE_PAUSED = 0x00000007,
}

[StructLayout(LayoutKind.Sequential)]
public struct ServiceStatus
{
public uint dwServiceType;
public ServiceState dwCurrentState;
public uint dwControlsAccepted;
public uint dwWin32ExitCode;
public uint dwServiceSpecificExitCode;
public uint dwCheckPoint;
public uint dwWaitHint;
};

我还写了一篇关于它的快速博客文章。

https://albertherd.com/2017/10/19/code-never-lies-documentation-sometimes-do/