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
英文地址,請注明出處:http://en.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…