首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# P/Invoke 參數類型對照表 (二) - 完整 Win32 API 映射

     編輯:關於C語言

承上篇 `Wtypes.h` 核心類型對照,本文提供更完整的 Win32 API 常見類型與 .NET 托管類型對照表,涵蓋指標、陣列、字串、結構體、回呼等進階場景。

完整對照表 (按字母序)

Win32 / C 型別.NET 托管型別備註 / MarshalAs 指示
BOOL, BOOLEANint / bool[MarshalAs(UnmanagedType.Bool)] (4 bytes)
BYTEbyteUnmanagedType.U1
CHARsbyte / byteANSI 字元,UnmanagedType.I1/U1
WCHAR / TCHAR (Unicode)charUnmanagedType.U2
SHORTshortUnmanagedType.I2
USHORT / WORDushortUnmanagedType.U2
INT / LONG / LONG32intUnmanagedType.I4
UINT / ULONG / DWORD / DWORD32uintUnmanagedType.U4
LONGLONG / INT64longUnmanagedType.I8
ULONGLONG / DWORD64ulongUnmanagedType.U8
FLOATfloatUnmanagedType.R4
DOUBLEdoubleUnmanagedType.R8
HANDLE / HWND / HMODULE / HINSTANCE / HICON / HCURSOR / HBRUSH / HPEN / HFONT / HBITMAP / HDC / HDWP / HKEY / HRGN / HMENU / HGDIOBJ / HFILE / HMONITOR / HWINSTA / HKL / HRAWINPUT / HTREEITEM / HPALETTE / HMETAFILE / HENHMETAFILE / HGLOBAL / HLOCAL / HRSRC / HSZ / HCONV / HCONVLIST / HDDEDATA / HACCEL / HDROP / ...IntPtr / nint (C# 9+)所有句柄統一用 IntPtr,32/64 位元自動適配
LPSTR / LPCSTR / PSTR / PCSTRstring / StringBuilder[MarshalAs(UnmanagedType.LPStr)] ANSI 字串
LPWSTR / LPCWSTR / PWSTR / PCWSTRstring / StringBuilder[MarshalAs(UnmanagedType.LPWStr)] Unicode 字串 (預設)
LPTSTR / LPCTSTR / PTSTR / PCTSTRstring / StringBuilder隨 TCHAR 定義自動對應 ANSI/Unicode
LPVOID / PVOID / LPVOIDIntPtr / byte[] / void*通用指標,視用途選 byte[] (陣列) 或 IntPtr (不透明)
LPBYTE / PBYTEbyte[][In/Out] byte[]
LPWORD / PWORDushort[]
LPLONG / PLONG / LPINT / PINTint[]
LPDWORD / PDWORDuint[]
LPARAM / WPARAMIntPtr / nint訊息參數,32/64 位元不同
LRESULTIntPtr / nint視窗程序回傳值
SIZE_T / SSIZE_TIntPtr / nuint指標大小無號整數
RECT / POINT / SIZE結構體 (struct)[StructLayout(LayoutKind.Sequential)] 對應欄位
GUID / CLSID / IIDGuid直接對應
FILETIMElong / DateTime100ns 間隔數,DateTime.FromFileTimeUtc
SYSTEMTIME結構體年月日時分秒毫秒欄位
VARIANTobject複雜,建議避免直接互操作
BSTRstring[MarshalAs(UnmanagedType.BStr)] COM 字串
SAFEARRAYArray極少直接用,建議用 COM Interop
函數指標 / 回呼delegatedelegate 簽章需完全匹配 calling convention (StdCall/ThisCall/Cdecl)

進階技巧

  1. CharSet 控制字串編碼:`[DllImport(..., CharSet = CharSet.Auto)]` 依平台自動選 ANSI/Unicode;明確指定 `CharSet.Ansi` 或 `CharSet.Unicode` 更安全。
  2. 結構體對齊:`[StructLayout(LayoutKind.Sequential, Pack = 1/4/8)]` 控制欄位對齊,必須與 C 端 `#pragma pack` 一致。
  3. In/Out 屬性:`[In]`, `[Out]`, `[In, Out]` 明確標記陣列/字串緩衝區方向,避免不必要的複制。
  4. SafeHandle 衍生類:封裝 `HANDLE` 類資源,確保關閉/釋放邏輯正確,防止洩漏。
  5. Function Pointer / Delegate:回呼委派必須保持存活 (防 GC 回收),常用 `GCHandle.Alloc(delegate)` 或靜態欄位持有。

驗證工具

  • P/Invoke Signature Toolkit (Visual Studio Extension) 自動生成簽名。
  • pinvoke.net 社群維護的海量簽名資料庫。
  • ClrMd / SOS 偵錯 Managed/Unmanaged 邊界問題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved