在我的程序中,我有一些DllImport
,因为我想调用一些本机API。 int
类型用于方法参数&返回类型。在我在新的Windows 2012 R2 Server(64位)上运行我的应用程序之前,它运行良好。当我将ref
参数的某个类型从int
更改为IntPtr
时,问题就解决了。
我知道IntPtr
用于表示指针或句柄。
但是,MSDN还说IntPtr
“设计为整数”,其大小是特定于平台的。因此,如果IntPtr
能够处理整数的平台特定大小,是否可以替换所有int
参数&使用IntPtr
返回类型?
我正在使用C#.NET 4.0。
答案 0 :(得分:3)
虽然这对于64位编译器来说可能听起来不是一件非常明智的事情,但是有一个很好的理由说明他们没有升级他们的原生整数类型。现代处理器速度非常快,但受到内存处理速度的限制。他们的执行引擎以千兆赫兹的速度运行,但内存总线速度很慢。与距离有关的电气设计问题,信号必须越远,它需要改变状态,以便仍然在电线的另一端正确识别。部分问题通过使用 caches ,位于执行引擎附近的内存副本来解决。这些缓存的大小不会翻倍。有效地使用缓存非常对于速度非常重要,因此在可能的情况下使用32位整数值非常重要。
IntPtr的本机类型的示例是任何指针类型,size_t,XXX_PTR,WPARAM,LRESULT。后者是typedef,它们可能使识别底层类型变得困难。如有疑问,请编写一个使用sizeof
的小程序,以便了解事实。
正式定义是64位本机编译器使用的data model。 Microsoft编译器使用LLP64。
答案 1 :(得分:1)
可以替换所有的int参数&使用IntPtr返回类型
不,不是。您需要单独查看每个用例。在需要指针的情况下(例如接收输出),IntPtr
更可能是正确的,因为如果您已经发现它可以正确调整平台指针宽度的大小
C#int
is 32-bits,无论底层操作系统是32位还是64位,都将匹配Win32 API中对应的固定宽度参数类型。 LONG
是DWORD
作为无符号等效项的一个示例。那里有are others,其他很多......