C# 我们能否在DllImport方法签名中用“IntPtr”替换所有“int”参数和返回类型?

C# 我们能否在DllImport方法签名中用“IntPtr”替换所有“int”参数和返回类型?,c#,c++,.net,dllimport,intptr,C#,C++,.net,Dllimport,Intptr,在我的程序中,我有一些DllImports,因为我想调用一些本机API。int type用于方法参数和返回类型。在我在新的Windows 2012 R2服务器64位上运行我的应用程序之前,它一直运行得很好。当我将ref参数的一个类型从int更改为IntPtr时,问题得到了解决 我知道IntPtr用于表示指针或句柄。 然而,MSDN还表示IntPtr被设计为一个整数,其大小是平台特定的。因此,如果IntPtr能够处理特定于平台的整数大小,那么可以用IntPtr替换所有int参数和返回类型吗 我正在

在我的程序中,我有一些DllImports,因为我想调用一些本机API。int type用于方法参数和返回类型。在我在新的Windows 2012 R2服务器64位上运行我的应用程序之前,它一直运行得很好。当我将ref参数的一个类型从int更改为IntPtr时,问题得到了解决

我知道IntPtr用于表示指针或句柄。 然而,MSDN还表示IntPtr被设计为一个整数,其大小是平台特定的。因此,如果IntPtr能够处理特定于平台的整数大小,那么可以用IntPtr替换所有int参数和返回类型吗


我正在使用C.NET4.0。

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

对于64位编译器来说,这样做听起来可能不太明智,但有一个很好的理由可以解释为什么他们没有升级其本机整数类型。现代处理器速度非常快,但受其寻址内存速度的限制。它们的执行引擎以千兆赫兹的速度运行,但内存总线的速度非常慢。一个与距离有关的电气设计问题,信号传播得越远,改变状态所需的速度就越慢,以便在导线的另一端仍能正确识别。通过使用缓存(位于执行引擎附近的内存副本)部分解决了一个问题。这些缓存的大小不会翻一番。有效地使用缓存对于提高速度非常重要,因此在可能的情况下使用32位整数值非常重要

IntPtr本机类型的示例包括任意指针类型、大小、XXX PTR、WPARAM、LRESULT。后者是typedef,它们会使识别底层类型变得困难。当有疑问时,编写一个使用sizeof的小C程序,这样您就知道了一个事实


形式定义由64位本机编译器使用。Microsoft编译器使用LLP64。

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

对于64位编译器来说,这样做听起来可能不太明智,但有一个很好的理由可以解释为什么他们没有升级其本机整数类型。现代处理器速度非常快,但受其寻址内存速度的限制。它们的执行引擎以千兆赫兹的速度运行,但内存总线的速度非常慢。一个与距离有关的电气设计问题,信号传播得越远,改变状态所需的速度就越慢,以便在导线的另一端仍能正确识别。通过使用缓存(位于执行引擎附近的内存副本)部分解决了一个问题。这些缓存的大小不会翻一番。有效地使用缓存对于提高速度非常重要,因此在可能的情况下使用32位整数值非常重要

IntPtr本机类型的示例包括任意指针类型、大小、XXX PTR、WPARAM、LRESULT。后者是typedef,它们会使识别底层类型变得困难。当有疑问时,编写一个使用sizeof的小C程序,这样您就知道了一个事实

形式定义由64位本机编译器使用。Microsoft编译器使用LLP64

可以用IntPtr替换所有int参数和返回类型吗

不,不是。您需要单独查看每个用例。例如,当需要一个指针来接收输出时,IntPtr更可能是正确的,因为正如您所发现的,它的大小将适合平台的指针宽度

C int,无论底层操作系统的参数是32位还是64位,都将与Win32 API中相应的固定宽度参数类型匹配。LONG是一个以DWORD作为其无符号等效项的示例。还有很多其他的

可以用IntPtr替换所有int参数和返回类型吗

不,不是。您需要单独查看每个用例。例如,当需要一个指针来接收输出时,IntPtr更可能是正确的,因为正如您所发现的,它的大小将适合平台的指针宽度


C int,无论底层操作系统的参数是32位还是64位,都将与Win32 API中相应的固定宽度参数类型匹配。LONG是一个以DWORD作为其无符号等效项的示例。还有很多其他的…

这可能会起作用,但正确的方法是在msdn上查找方法的签名,然后检查类型概述tTable以查看ehich方法是否具有本机大小。这可能会起作用,但 正确的方法是在msdn上查找方法的签名,然后检查类型概述TQL文件,以查看ehich文件是否具有本机大小。