- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的程序中,我有一些 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 别名)中看到 int 或 long,那么您仍然在 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/
我正在尝试使用 BitmapData 类?并且在将 IntPtr 值分配给 BitmapData.Scan0 属性时遇到一些问题。这是我的代码: var data = bmp.LockBits(new
我正在尝试使用 BitmapData 类?并且在将 IntPtr 值分配给 BitmapData.Scan0 属性时遇到一些问题。这是我的代码: var data = bmp.LockBits(new
我有两个 IntPtr 值指向一些 length 字节的数据区域。 length 可能有 200k 到 400k 的数量级。 int length = /* ..*/ IntPtr ptrSrc =
我在网上到处都看过,似乎找不到能够解决该问题的特定答案。从字面上看,这是我得到的唯一错误,只有在解决此问题后才能构建可执行文件。 int num3 = new VAMemory(Data.proces
我不知道 Copy(IntPtr[], Int32, IntPtr, Int32) 方法是如何工作的。我虽然它可以将多个 IntPtr 中包含的数据复制到一个 IntPtr 中(如 MSDN 所述),
我有一个类的以下代码。这是一个类的初始化。 第三方动态链接库 [DllImport("gdi32.dll")] public static extern IntPtr CreateCompatib
我刚刚了解到 IntPtr.Zero 无法与 default(IntPtr) 相提并论。谁能告诉我为什么? IntPtr.Zero == new IntPtr(0) -> "could not eva
这两种说法有什么区别吗: IntPtr myPtr = new IntPtr(0); IntPtr myPtr2 = IntPtr.Zero; 我见过许多使用 PInvoke 的示例,如果 myPtr
这个问题已经有答案了: What makes more sense - char* string or char *string? [duplicate] (13 个回答) 已关闭 9 年前。 本能地
我知道 Marshal.SizeOf() 和 sizeof() 有多么根本的不同。但是在 IntPtr 的情况下,无论 CPU 架构如何,它们都不会总是返回完全相同的东西吗? 最佳答案 一方面,有原始
我需要实现一个与找到的解决方案非常相似的解决方案 here ,写于 2009 年,用于检索文件的唯一标识符。具体来说,我正在查看答案的 ApproachB()函数和以下行(重写了一点以反射(refle
是否可以通过 Skype 用户窗口获取处理程序并使用 SendMessage(whdl,BM_CLICK,intptr.zero,intrptr.zero,intptr.zero) 单击发送文件或调用
经过一些研究我翻译了 pHandle = IntPtr.Zero; 到德尔福 var pHandle: Pointer; 当我在 Delphi 中中断调试时,我得到 $314328,当我在 C s
运营商的description on MSDN有一句话: An exception is only thrown if the value of value requires more bits th
这个函数在一个循环中。当我运行程序时,带有 IntPtr 的行给我内存问题,我已经删除 [],但它仍然没有解决内存问题,有人可以帮忙吗?谢谢 void showImage(IplImage *img,
直到最近,我还认为在 P/Invoke 中编码 IntPtr 只会涉及“blitting”操作;即简单地从例如复制指针C++ 到 C#。 然而,我最近与某人交谈时提到,事情远不止于此。他特别提到 In
我目前正在编写一些代码,这些代码反射(reflect)了从对 native dll 的调用中编码返回的结构。一些结构包含指向以 null 结尾的指针数组的 IntPtr* 字段。这些字段需要特殊处理。
我正在尝试在 Ubuntu 14.04 上使用 Mono 执行函数 P/Invoke: [DllImport(@"libRT", CharSet = CharSet.Ansi, CallingConv
我有一个类定义如下: [StructLayout(LayoutKind.Sequential)] public class OUR_MEM_STR {
我遇到了一段C#源码如下 int* ptr = ...; int w = ...; int* ptr3 = ptr + (IntPtr)w; CS0019: Operator '+' cannot
我是一名优秀的程序员,十分优秀!