当前位置: 首页 > news >正文

P/Invoke 在默认封送(marshalling)规则下,常见托管 ⇄ 非托管类型的对应关系

下表整理了 P/Invoke 在默认封送(marshalling)规则下,常见托管 ⇄ 非托管类型的对应关系
内容主要依据微软官方 Marshalling Data with Platform Invoke 文档,并补充了常见指针/句柄用法与字符串缓冲区(StringBuilder)注意事项。(learn.microsoft.com, learn.microsoft.com)

常见基础数值与指针类型映射

Windows / Win32 类型C / C++ 类型C# 托管类型说明
VOIDvoidvoid用于无返回值函数
HANDLEvoid*IntPtr / UIntPtr平台相关指针大小
BYTEunsigned charbyte
SHORTshortshort (Int16)
WORDunsigned shortushort (UInt16)
INT / LONGint / long (32‑bit)int (Int32)
UINT / DWORD / ULONGunsigned int / longuint (UInt32)
BOOLlong (Win32)bool / int4 字节;返回值时多用 bool
FLOATfloatfloat (Single)
DOUBLEdoubledouble
SIZE_Tsize_tUIntPtr平台相关大小
INT_PTR / LONG_PTRintptr_t/long*IntPtr
UINT_PTRuintptr_tUIntPtr

提示:所有以 …_PTR 结尾的 Windows 类型(如 HINSTANCE, LPARAM 等)在 C# 中一般使用 IntPtr;这样无论 x86 还是 x64 都能正确扩展。(stackoverflow.com)

字符与字符串相关映射

Windows / C 类型默认托管类型需要的 CharSet / MarshalAs
CHARchar (System.Char)CharSet.Ansi 时为 ANSI,常见于旧 API
WCHARcharCharSet.Unicode 下与 System.Char 对应
LPSTR / char*stringStringBuilderANSI;[MarshalAs(UnmanagedType.LPStr)]
LPCSTR / const char*同上(只读)
LPWSTR / wchar_t*string / StringBuilderUnicode;UnmanagedType.LPWStr
LPCWSTR / const wchar_t*同上(只读)
  • 输入字符串:直接用 string 即可,由运行时负责编码转换。
  • 输出 / 可读写字符串缓冲区:用 StringBuilder 并在参数前加 [Out](默认 In/Out)。
    但 .NET 9 及最新代码分析规则 CA1838 建议改为手动分配字节缓冲区以减少复制开销。(learn.microsoft.com, learn.microsoft.com)

结构体与数组简表

非托管形态典型托管声明关键属性
纯 POD 结构体(顺序字段)[StructLayout(LayoutKind.Sequential)] struct Foo { … }如有字节对齐需求再加 Pack = N
结构体指针ref Foo / out Foo / IntPtrref/out 让 CLR 自动生成 Foo* 指针
数组输入byte[] data[In] 可省略
数组输出或 In/Out[Out] byte[] data / IntPtr需预分配长度并传入;或用 IntPtr + Marshal.Copy

若结构体包含指针或可变长成员(如 char*),建议拆分为“句柄 + 访问函数”的形式而不是直接封送复杂结构。(devblogs.microsoft.com)

获取更多官方资源

  • 微软文档: Marshalling Data with Platform Invoke 提供最权威、最完整的类型对照表及示例。(learn.microsoft.com, learn.microsoft.com)
  • pinvoke.net: 社区维护的 API 定义仓库,查看具体 Windows 函数的推荐托管签名。(pinvoke.net)
  • .NET Blog & DevBlogs: 深入了解各版本运行时对 interop 的改进与性能调优。(devblogs.microsoft.com, devblogs.microsoft.com)

(本篇文章由本人编写,ChatGPT润色)

http://www.dtcms.com/a/266505.html

相关文章:

  • Jenkins-Publish HTML reports插件
  • Oracle DB和PostgreSQL,OpenGauss主外键一致性的区别
  • 强化学习 (10)蒙特卡洛
  • SRE - - PV、UV、VV、IP详解及区别
  • Web基础关键_008_JavaScript 的 BOM、ES6、构造函数、原型
  • 利用 AI 打造的开发者工具集合
  • 【Unity笔记02】订阅事件-自动开门
  • 模型部署与推理--利用libtorch模型部署与推理
  • Redisearch接入SpringBoot项目使用
  • MySQL 中 -> 和 ->> 操作符的区别
  • github上部署自己的静态项目
  • 【狂飙AGI】第7课:AGI-行业大模型(系列1)
  • jsonCPP 开源库详解
  • CentOS配置网络
  • RocketMQ延迟消息是如何实现的?
  • 深度学习基础1
  • 基于Android的财务记账App
  • 【wps】 excel 删除重复项
  • AI 应用于进攻性安全
  • linux_git的使用
  • MySQL 8.0:窗口函数
  • 【Unity开发】Unity实现对模型移动、缩放、旋转操作的功能
  • 基于Docker构建OrangePi5 SDK环境
  • 408第三季part2 - 计算机网络 - 计算机网络基本概念
  • 闲庭信步使用SV搭建图像测试平台:第二十九课——绘制正弦波的图片
  • Android 实现底部弹窗
  • Datasophon的Ranger安装时数据库踩坑及问题解决
  • NeighborGeo:基于邻居的IP地理定位(三)
  • NeighborGeo:基于邻居的IP地理定位(二)
  • 【WEB】Polar靶场 6-10题 详细笔记