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

C# 與 C/C++ 資料類型對應表:P/Invoke 封送處理完整參考

     編輯:關於C#

基本數值類型對應

Win32 / C 類型C/C++ 關鍵字.NET 類型 (System)位元寬度備註
HANDLE / PVOIDvoid*IntPtr / UIntPtr32/64 位元隨平台句柄、指標通用
BYTEunsigned charByte8
SHORTshortInt1616
WORD / USHORTunsigned shortUInt1616
INT / LONGint / longInt3232Windows 長整數為 32 位元
UINT / ULONG / DWORDunsigned int / unsigned longUInt3232
LONGLONG / INT64long long / __int64Int6464
ULONGLONG / DWORDLONGunsigned long longUInt6464
FLOATfloatSingle32IEEE 754
DOUBLEdoubleDouble64IEEE 754
BOOLint / long (Win32)Int32 / Boolean32Win32 BOOL 為 4 bytes;C++ bool 為 1 byte
CHARcharSByte / Byte8有號/無號視語境
WCHARwchar_tChar16UTF-16

字串與陣列指標對應

非托管類型C/C++ 宣告.NET 封送類型CharSet / 屬性
LPSTRchar*string / StringBuilder[MarshalAs(UnmanagedType.LPStr)] / CharSet.Ansi
LPCSTRconst char*string / StringBuilder[MarshalAs(UnmanagedType.LPStr)] / CharSet.Ansi
LPWSTRwchar_t*string / StringBuilder[MarshalAs(UnmanagedType.LPWStr)] / CharSet.Unicode (預設)
LPCWSTRconst wchar_t*string / StringBuilder[MarshalAs(UnmanagedType.LPWStr)] / CharSet.Unicode
固定長度陣列char name[32]string / StringBuilder[MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)]

結構體封送關鍵屬性

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 4)]
public struct MY_STRUCT
{
    public int Id;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
    public string Path;       // 固定長度字串
    public IntPtr Handle;     // 指標/句柄
    public double Value;
    // 陣列需指定大小
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
    public int[] Items;
}
  • LayoutKind.Sequential:依宣告順序配置,符合 C 結構體預設。
  • Pack:對齊邊界 (1, 2, 4, 8);需與 C 端 #pragma pack 一致。
  • CharSet:決定字串封送為 ANSI 或 Unicode,影響 string、Char 編碼。

常見陷阱與對策

陷阱現象解決
長整數寬度不一C++ long 在 64-bit Linux 為 8 bytes,Windows 為 4 bytesWindows 端固定用 Int32;跨平台用 IntPtr 或明確 int32_t/int64_t
BOOL vs boolWin32 BOOL 4 bytes,C++ bool 1 byteP/Invoke 簽名用 int 或 Int32 對應 BOOL;byte 對應 bool
字串編碼錯誤中文亂碼明確指定 CharSet = CharSet.Unicode 或 Ansi,勿依賴預設
結構體對齊欄位位移錯誤導致讀寫錯誤檢查 Pack、LayoutKind,使用 offsetof 驗證
記憶體釋放非托管配置記憶體未釋放約定由呼叫端釋放,或提供 Free 函數;.NET 端用 Marshal.FreeHGlobal/FreeCoTaskMem

快速查詢速查表 (GitHub Gist 風格)

// 數值
HANDLE      -> IntPtr
DWORD       -> uint
LONG        -> int
ULONGLONG   -> ulong
FLOAT       -> float
DOUBLE      -> double

// 字串 (預設 Unicode)
LPCWSTR     -> string
LPWSTR      -> StringBuilder (輸出緩衝區)
LPCSTR      -> string (CharSet.Ansi)

// 陣列/指標
int*        -> int[] / ref int / IntPtr
BYTE*       -> byte[] / IntPtr

// 結構體
struct FOO  -> [StructLayout(LayoutKind.Sequential)] struct Foo { ... }

總結

正確的類型對應是 P/Invoke 穩定互通的基石。建議將上表做為團隊共享文件,並在程式碼審查時核對 StructLayout、MarshalAs、CharSet 與 Pack 設定,避免 90% 的封送錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved