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.pswp.cn/web/87592.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.isaacsim4.2 教程-初识OmniGraph

1. OmniGraph(视觉编程) OmniGraph 是 Omniverse 的可视化编程框架。它提供了一个图状结构,将 Omniverse 内多个系统的功能节点串联起来;同时也是一个计算框架,允许你编写高度自定义的节点,将自己的功能无…

MonoGame 游戏开发框架日记 -03

第三章:创建类库 内容介绍 主要内容:创建Core类并编写 创建这个类主要是为了后续开发方便,并介绍游戏开发中的一种非常重要编程模式 单例模式,以及了解MonoGame基本图形渲染知识单例模式: 第一步我们得先了解什么是单例…

AES 256 CBC加密和解密

AES-256-CBC 是一种对称加密算法,使用 256位密钥 和 CBC(Cipher Block Chaining)模式。它的典型使用场景包括对敏感信息进行加密存储或传输。下面是 AES-256-CBC 的加密与解密的 Python 示例,使用 pycryptodome 库: &a…

Git 版本控制完全指南:从入门到精通

Git 版本控制完全指南:从入门到精通 作为当今最流行的分布式版本控制系统,Git 已经成为开发者必备的技能之一。无论你是独立开发者还是团队协作,Git 都能帮助你高效管理代码版本。本文将带你从零开始,逐步掌握 Git 的核心概念和常…

408第三季part2 - 计算机网络 - 计算机网络分层结构

理解 PCI会放一些控制信息,源地址目的地址都在里面 SDU是放的数据 整个加起来是PDU 每一层的SDU都是上一层的PDU 看一看 也是简单看一看就行 网络层有时候也叫IP数据报 这里断点下载的意思就是,你下载东西的时候网络断了,再连回来的时候会接…

打开摄像头,服务器和客户端传输摄像头图像数据

1&#xff1a;Camera Server 主要功能&#xff0c;打开摄像头&#xff0c;接收客户端请求 接收到客户端请求“R”字符后开始传输摄像头图像。 #include "mainwindow.h" #include "ui_mainwindow.h"#include<QDebug>MainWindow::MainWindow(QWidget…

Android实现获取前台应用信息

Android实现获取前台应用信息 1.前言&#xff1a; 之前需要获取在后台运行的App信息&#xff0c;比如包名、版本这些常规的&#xff0c;今天是讲解获取在前台的App信息&#xff0c;虽然App在前台&#xff0c;但是具体的信息可能不知道&#xff0c;今天就尝试获取一下&#xf…

快讯|美团即时零售日订单已突破1.2亿,餐饮订单占比过亿

据美团内网公布信息显示&#xff0c;截至22时54分&#xff0c;美团即时零售当日订单已经突破了1.2亿单&#xff0c;其中&#xff0c;餐饮订单已超过1亿单。 值得注意的是&#xff0c;就在当晚20时45分&#xff0c;美团内网曾显示即时零售日订单突破了1亿。这也意味着&#xff…

pycharm2018配置gitee操作

一、gitee介绍及下载安装 gitee介绍&#xff1a; gitee别名码云&#xff0c;是中国的一个代码托管平台&#xff0c;类似于GitHub&#xff0c;基于Git技术&#xff0c;提供远程仓库托管、协作功能和开源社区服务&#xff0c;优势包括访问速度快、本地化服务和政策合规git和gite…

数据结构——栈的讲解(超详细)

数据结构——栈的讲解&#xff08;超详细&#xff09;-腾讯云开发者社区-腾讯云 #include"Stack.h" void STInit(ST* ps) {ps->arr NULL;ps->capacity ps->top 0; //总空间个数和有用空间个数都初始化为0 }void STDestroy(ST* ps) {if (ps -> arr) …

MySQL允许root用户远程连接

注意&#xff1a;在实际生产环境中&#xff0c;允许root用户从任意主机&#xff08;‘%’&#xff09;连接存在安全风险&#xff0c;建议使用强密码并限制访问IP&#xff0c;或者创建具有必要权限的单独用户用于远程连接。MySQL 配置远程连接指南 1. 登录 MySQL 服务器 mysql -…

STM32的 syscalls.c 和 sysmem.c

syscalls.c 是 STM32CubeIDE 自动生成的标准系统调用适配文件&#xff0c;用于裸机环境下支持 newlib 标准库&#xff08;如 printf, scanf, malloc&#xff09;的运行。这份文件提供了标准库运行所需的最小系统调用实现。现在我来逐段解析其作用&#xff0c;并补充你可能需要修…

Java零基础笔记01(JKD及开发工具IDEA安装配置)

1.Java简介 Java是一种广泛使用的计算机编程语言&#xff0c;由美国的Sun Microsystems公司&#xff08;Stanford University Network&#xff09;在1995年推出。Java以其跨平台、面向对象、安全性高等特点&#xff0c;广泛应用于企业级应用开发、移动应用开发等领域。2009年&a…

Spark SQL架构及高级用法

Spark SQL 架构概述 架构核心组件 API层&#xff08;用户接口&#xff09; 输入方式&#xff1a;SQL查询&#xff1b;DataFrame/Dataset API。统一性&#xff1a; 所有接口最终转换为逻辑计划树&#xff08;Logical Plan&#xff09;&#xff0c;进入优化流程。 编译器层&…

【机器学习深度学习】什么是下游任务模型?

目录 前言 一、什么是下游任务模型&#xff1f; 二、为什么需要下游任务模型&#xff1f; 三、下游任务模型都在干嘛&#xff1f; 四、下游模型怎么训练出来的&#xff1f; 五、图解理解&#xff1a;上游 vs 下游 六、一个现实案例&#xff1a;BERT做情感分析 原始数据…

补充:问题:CORS ,前后端访问跨域问题

补充&#xff1a;问题&#xff1a;CORS &#xff0c;前后端访问跨域问题 我这边的解决方法是&#xff1a; myAxios.defaults.withCredentials true; // 配置为true&#xff0c;表示前端向后端发送请求的时候&#xff0c;需要携带上凭证cookie整体的&#xff1a; import axio…

洛谷 P13014 [GESP202506 五级] 最大公因数-普及-

题目描述 对于两个正整数 a,ba,ba,b&#xff0c;他们的最大公因数记为 gcd⁡(a,b)\gcd(a,b)gcd(a,b)。对于 k>3k > 3k>3 个正整数 c1,c2,…,ckc_1,c_2,\dots,c_kc1​,c2​,…,ck​&#xff0c;他们的最大公因数为&#xff1a; gcd⁡(c1,c2,…,ck)gcd⁡(gcd⁡(c1,c2,……

前端-CSS-day1

目录 1、初识CSS 2、CSS引入方式 3、标签选择器 4、类选择器 5、id选择器 6、通配符选择器 7、画盒子 8、字体大小 9、字体粗细 10、字体倾斜 11、行高 12、行高-垂直居中 13、字体族 14、font属性 15、文本缩进 16、文本对齐方式 17、图片对齐方式 18、文本…

解锁万能文件内容提取器:Apache Tika

01 引言 在日常工作中&#xff0c;你是否曾为这些场景头疼过&#xff1f; 堆积如山的PDF、Word、Excel文档&#xff0c;如何快速提取关键信息&#xff1f;用户上传的文件五花八门&#xff0c;如何自动识别类型并安全处理&#xff1f;构建搜索引擎时&#xff0c;如何让系统“读懂…

gemini-cli初体验

目录 准备配置环境变量运行使用基础使用配置MCP调用MCP 参考 准备 NodeJS 18版本 配置环境变量 设置GEMINI_API_KEY 变量&#xff0c;在https://aistudio.google.com/apikey创建key 设置代理&#xff08;可选&#xff0c;取决于您的网络&#xff09;,不配置可能会报错 api e…