Struct 如何判断MonitorInfo中的cbSize是int还是uint?

Struct 如何判断MonitorInfo中的cbSize是int还是uint?,struct,pinvoke,marshalling,Struct,Pinvoke,Marshalling,我正在尝试使用平台调用做一些多监视器的工作。我一直用它来开始,但我遇到了一个定义不一致的问题 在(和)中,尺寸定义为: public int Size; 但是,在使用MonitorInfo的示例代码中,我们看到: mi.size = (uint)Marshal.SizeOf(mi); 显然,其中一个是不正确的 在MSDN文档中,声明为: typedef struct tagMONITORINFO { DWORD cbSize; RECT rcMonitor; RECT rcW

我正在尝试使用平台调用做一些多监视器的工作。我一直用它来开始,但我遇到了一个定义不一致的问题

在(和)中,尺寸定义为:

public int Size;
但是,在使用MonitorInfo的示例代码中,我们看到:

mi.size = (uint)Marshal.SizeOf(mi);
显然,其中一个是不正确的

在MSDN文档中,声明为:

typedef struct tagMONITORINFO {
  DWORD cbSize;
  RECT  rcMonitor;
  RECT  rcWork;
  DWORD dwFlags;
} MONITORINFO, *LPMONITORINFO;
将cbSize定义为:

public int Size;
结构的大小,以字节为单位

在调用函数之前,将此成员设置为sizeof(MONITORINFO)。这样做可以让函数确定要传递给它的结构类型

你知道我如何计算出它应该是int还是uint吗


注意:我知道System.Windows.Forms中提供了一些这方面的内容,但我正在尝试使用Silverlight 5中的p/Invoke来实现这一点。

DWORD
是一个无符号32位整数,因此
uint
在技术上是正确的

使用
int
的版本大概是通过温和的laze实现的。作者可能不想将
marshall.SizeOf()
的返回值强制转换为
uint

实际上,这并不重要,因为
cbSize
永远不会达到从有符号到无符号的转换有任何区别的程度。然而,在某些情况下,这可能很重要。例如,包含位标志组合的变量。

本机类型是DWORD,Windows api中无符号整数的别名。这是有道理的,结构的大小永远不能是负数。但是这种结构的pinvoke声明通常使用int而不是uint。在pinvoke.net提供的

这通常是为了方便起见,Marshal.SizeOf()返回一个int,而不是uint。这样做是为了使方法CLSCompliant,有许多语言不支持无符号类型。Java和最初的Visual Basic就是很好的例子

这不是问题,对于0和int.MaxValue之间的值,int和uint具有相同的大小和相同的位模式。超出int.MaxValue使uint起作用不是一个实际问题。结构从来没有那么大。如果您有一个是这样的,那么无论如何它都将不可用,CLR不支持大于2GB的托管类型。至少达到.NET 4.5

因此,为了回答这个问题,代码片段是由某个人编写的,他将结构成员声明为uint,因此需要强制转换。两种方式都可以