我在我的C#应用程序中调用了SetServiceStatus。微软的实施决定了DWORD components of SERVICE_STATUS struct are Marshalled as long (Int64) rather than int.
我知道这些需要是无符号的(但是CLS不允许使用无符号类型),所以我想知道微软是否建议使用long而不是int来绕过未签名的CLS问题?
另外,唠叨我说DWORD是32位且长(C#)的东西是64位,但微软的例子说结构要声明为顺序布局,所以我不明白这是如何工作的(确认在我的机器上工作)
答案 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/