我们可以替换所有“int”参数&在DllImport方法签名中返回带有“IntPtr”的类型?

时间:2015-04-07 08:05:41

标签: c# c++ .net dllimport intptr

在我的程序中,我有一些DllImport,因为我想调用一些本机API。 int类型用于方法参数&返回类型。在我在新的Windows 2012 R2 Server(64位)上运行我的应用程序之前,它运行良好。当我将ref参数的某个类型从int更改为IntPtr时,问题就解决了。

我知道IntPtr用于表示指针或句柄。 但是,MSDN还说IntPtr“设计为整数”,其大小是特定于平台的。因此,如果IntPtr能够处理整数的平台特定大小,是否可以替换所有int参数&使用IntPtr返回类型?

我正在使用C#.NET 4.0。

2 个答案:

答案 0 :(得分:3)

不,你不能盲目地这样做。 64位代码仍然大量使用32位整数类型,它们的“本机整数”仍然是32位值。如果在本机代码声明(或等效的typedef别名)中看到 int long ,那么您仍然在pinvoke声明中使用 int

虽然这对于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中对应的固定宽度参数类型。 LONGDWORD作为无符号等效项的一个示例。那里有are others,其他很多......