2015-04-07 51 views
1

在我的程序中,我有一些DllImport,因为我想调用一些本机API。 int类型用于返回类型的方法参数&。直到我在新的Windows 2012 R2服务器(64位)上运行我的应用程序之前,它工作得很好。当我将ref参数的类型中的一个从int更改为IntPtr时,问题得到解决。我们可以用DllImport方法签名中的“IntPtr”替换所有“int”参数和返回类型吗?

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

我正在使用C#.NET 4.0。

+0

它可能会工作,但正确的方法是在msdn上查找方法的签名,然后检查类型概述tqble以查看具有本机大小的类型概述。 – CodesInChaos

回答

3

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

尽管对于64位编译器来说这听起来不是一件非常明智的事情,但他们没有升级其本地整数类型的原因有很好的理由。现代处理器速度非常快,但受限于其处理内存的速度。他们的执行引擎以千兆赫兹的速度运行,但内存总线速度很慢。与距离相关的电气设计问题,信号不得不越移越慢,它需要改变状态,以在导线的另一端仍能正确识别。一个问题部分通过使用缓存,位于执行引擎附近的内存副本解决。这些缓存的大小不会增加一倍。有效使用高速缓存非常重要,因此在可能的情况下使用32位整数值非常重要。

的本机类型的示例IntPtr是任何指针类型,size_t,XXX_PTR,WPARAM,LRESULT。后者是typedef,它们可以使识别底层类型变得困难。如果有疑问,写一个使用sizeof的C程序,这样你就知道了一个事实。

正式定义是由64位本机编译器使用的data model。微软编译器使用LLP64。

1

是确定以替换所有int参数&返回类型与IntPtr的

不,它不是。您需要分别查看每个用例。在需要指针(例如接收输出)的情况​​下,IntPtr更可能是正确的,因为它将根据您找到的平台指针宽度正确调整大小。

C#intis 32-bits无论底层操作系统是32位还是64位,并且将匹配Win32 API中相应的固定宽度参数类型。 LONGDWORD作为其无符号等效项的一个示例。有are others,其他许多...

相关问题