我们可以将所有"int"参数和返回类型替换为 DllImport 方法签名中的"IntPtr"吗?

Can we replace all "int" parameter & return types with "IntPtr" in the DllImport method signature?

本文关键字:方法 DllImport IntPtr 返回类型 int 我们 参数 替换      更新时间:2023-10-16

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

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

我使用的是C#.NET 4.0。

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

虽然对于64位编译器来说,这听起来可能不是一件非常明智的事情,但他们没有升级本机整数类型是有充分理由的。现代处理器速度极快,但它们寻址内存的速度有限。它们的执行引擎以千兆赫的速度运行,但内存总线的速度慢得惊人。一个与距离有关的电气设计问题是,信号必须传播得越远,它需要改变状态的速度就越慢,才能在电线的另一端正确识别。通过使用缓存(位于执行引擎附近的内存副本)部分解决了一个问题。这些缓存的大小不会翻倍。有效地使用缓存对速度非常重要,因此在可能的情况下使用32位整数值非常重要。

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

形式定义是64位本机编译器使用的数据模型。Microsoft编译器使用LLP64。

可以替换所有int参数&带有IntPtr 的返回类型

不,不是。您需要单独查看每个用例。如果需要指针(例如接收输出),则IntPtr更有可能是正确的,因为它的大小将与您发现的平台的指针宽度相匹配。

无论底层操作系统是32位还是64位,C#int都是32位,并且将与Win32 API中对应的固定宽度参数类型相匹配。CCD_ 14是以CCD_ 15作为其无符号等价物的一个例子。还有其他很多。。。