gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:49:09 25 4
gpt4 key购买 nike

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

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

我正在使用 C# .NET 4.0。

最佳答案

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

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

IntPtr 的 native 类型的示例是任何指针类型、size_t、XXX_PTR、WPARAM、LRESULT。后者是 typedef,它们会使识别底层类型变得困难。如有疑问,请编写一个使用 sizeof 的小 C 程序,以便了解一个事实。

正式定义是data model由 64 位 native 编译器使用。 Microsoft 编译器使用 LLP64。

关于c# - 我们可以用 DllImport 方法签名中的 "int"替换所有 "IntPtr"参数和返回类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29486749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com