我们可以将所有"int"参数和返回类型替换为 DllImport 方法签名中的"IntPtr"吗?
Can we replace all "int" parameter & return types with "IntPtr" in the DllImport method signature?
在我的程序中,我有一些DllImport
,因为我想调用一些本机API。CCD_ 2类型用于方法参数&返回类型。在我在新的Windows 2012 R2服务器(64位)上运行应用程序之前,它一直运行得很好。当我将其中一个ref
参数的类型从int
更改为IntPtr
时,问题得到了解决。
我知道IntPtr
是用来表示指针或句柄的。然而,MSDN也表示IntPtr
"被设计为一个整数",其大小是特定于平台的。因此,如果IntPtr
能够处理整数的平台特定大小,是否可以替换所有int
参数&返回具有IntPtr
的类型?
我使用的是C#.NET 4.0。
不,你不能盲目地这么做。64位代码仍然大量使用32位整数类型,它们的"原生整数"仍然是32位值。如果在本机代码声明中看到int或long(或等效的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作为其无符号等价物的一个例子。还有其他很多。。。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 我们可以将所有"int"参数和返回类型替换为 DllImport 方法签名中的"IntPtr"吗?
- dllimport将一个c++方法移植到c#.当从C#调用时,程序关闭,没有任何错误消息
- c++方法从c#dllimport调用返回0
- 通过 DllImport 在 C# 中调用 C 方法 - 尝试读取或写入受保护的内存