1. 程式人生 > >C++與C#資料型別對應關係總結

C++與C#資料型別對應關係總結

API與C#的資料型別對應關係表
API資料型別 型別描述 C#型別 API資料型別 型別描述 C#型別
WORD 16位無符號整數 ushort CHAR 字元 char
LONG 32位無符號整數 int DWORDLONG 64位長整數 long
DWORD 32位無符號整數 uint HDC 裝置描述表控制代碼 int
HANDLE 控制代碼,32位整數 int HGDIOBJ GDI物件控制代碼 int
UINT 32位無符號整數 uint HINSTANCE 例項控制代碼 int
BOOL 32位布林型整數 bool HWM 視窗控制代碼 int
LPSTR 指向字元的32位指標 string HPARAM 32位訊息引數 int
LPCSTR 指向常字元的32位指標 String LPARAM 32位訊息引數 int
BYTE 位元組 byte WPARAM 32位訊息引數 int

Wtypes.h 中的非託管型別

非託管 C 語言型別

託管類名

說明

HANDLE

void*

System.IntPtr

32 位

BYTE

unsigned char

System.Byte

8 位

SHORT

short

System.Int16

16 位

WORD

unsigned short

System.UInt16

16 位

INT

int

System.Int32

32 位

UINT

unsigned int

System.UInt32

32 位

LONG

long

System.Int32

32 位

BOOL

long

System.Int32

32 位

DWORD

unsigned long

System.UInt32

32 位

ULONG

unsigned long

System.UInt32

32 位

CHAR

char

System.Char

用 ANSI 修飾。

LPSTR

char*

System.String 或System.StringBuilder

用 ANSI 修飾。

LPCSTR

Const char*

System.String 或System.StringBuilder

用 ANSI 修飾。

LPWSTR

wchar_t*

System.String 或System.StringBuilder

用 Unicode 修飾。

LPCWSTR

Const wchar_t*

System.String 或System.StringBuilder

用 Unicode 修飾。

FLOAT

Float

System.Single

32 位

DOUBLE

Double

System.Double

64 位

//C++中的DLL函式原型為
  //extern "C" __declspec(dllexport) bool 方法名一(const char* 變數名1, unsigned char* 變數名2)
  //extern "C" __declspec(dllexport) bool 方法名二(const unsigned char* 變數名1, char* 變數名2)

  //C#呼叫C++的DLL蒐集整理的所有資料型別轉換方式,可能會有重複或者多種方案,自己多測試
  //c++:HANDLE(void *) ---- c#:System.IntPtr  
  //c++:Byte(unsigned char) ---- c#:System.Byte  
  //c++:SHORT(short) ---- c#:System.Int16  
  //c++:WORD(unsigned short) ---- c#:System.UInt16  
  //c++:INT(int) ---- c#:System.Int16
  //c++:INT(int) ---- c#:System.Int32  
  //c++:UINT(unsigned int) ---- c#:System.UInt16
  //c++:UINT(unsigned int) ---- c#:System.UInt32
  //c++:LONG(long) ---- c#:System.Int32  
  //c++:ULONG(unsigned long) ---- c#:System.UInt32  
  //c++:DWORD(unsigned long) ---- c#:System.UInt32  
  //c++:DECIMAL ---- c#:System.Decimal  
  //c++:BOOL(long) ---- c#:System.Boolean  
  //c++:CHAR(char) ---- c#:System.Char  
  //c++:LPSTR(char *) ---- c#:System.String  
  //c++:LPWSTR(wchar_t *) ---- c#:System.String  
  //c++:LPCSTR(const char *) ---- c#:System.String  
  //c++:LPCWSTR(const wchar_t *) ---- c#:System.String  
  //c++:PCAHR(char *) ---- c#:System.String  
  //c++:BSTR ---- c#:System.String  
  //c++:FLOAT(float) ---- c#:System.Single  
  //c++:DOUBLE(double) ---- c#:System.Double  
  //c++:VARIANT ---- c#:System.Object  
  //c++:PBYTE(byte *) ---- c#:System.Byte[] 

  //c++:BSTR ---- c#:StringBuilder
  //c++:LPCTSTR ---- c#:StringBuilder
  //c++:LPCTSTR ---- c#:string
  //c++:LPTSTR ---- c#:[MarshalAs(UnmanagedType.LPTStr)] string  
  //c++:LPTSTR 輸出變數名 ---- c#:StringBuilder 輸出變數名
  //c++:LPCWSTR ---- c#:IntPtr
  //c++:BOOL ---- c#:bool   
  //c++:HMODULE ---- c#:IntPtr   
  //c++:HINSTANCE ---- c#:IntPtr  
  //c++:結構體 ---- c#:public struct 結構體{};  
  //c++:結構體 **變數名 ---- c#:out 變數名 //C#中提前申明一個結構體例項化後的變數名
  //c++:結構體 &變數名 ---- c#:ref 結構體 變數名
   

  //c++:WORD ---- c#:ushort
  //c++:DWORD ---- c#:uint
  //c++:DWORD ---- c#:int

  //c++:UCHAR ---- c#:int
  //c++:UCHAR ---- c#:byte
  //c++:UCHAR* ---- c#:string
  //c++:UCHAR* ---- c#:IntPtr

  //c++:GUID ---- c#:Guid
  //c++:Handle ---- c#:IntPtr
  //c++:HWND ---- c#:IntPtr
  //c++:DWORD ---- c#:int
  //c++:COLORREF ---- c#:uint


  //c++:unsigned char ---- c#:byte
  //c++:unsigned char * ---- c#:ref byte
  //c++:unsigned char * ---- c#:[MarshalAs(UnmanagedType.LPArray)] byte[]
  //c++:unsigned char * ---- c#:[MarshalAs(UnmanagedType.LPArray)] Intptr

  //c++:unsigned char & ---- c#:ref byte
  //c++:unsigned char 變數名 ---- c#:byte 變數名
  //c++:unsigned short 變數名 ---- c#:ushort 變數名
  //c++:unsigned int 變數名 ---- c#:uint 變數名
  //c++:unsigned long 變數名 ---- c#:ulong 變數名

  //c++:char 變數名 ---- c#:byte 變數名 //C++中一個字元用一個位元組表示,C#中一個字元用兩個位元組表示
  //c++:char 陣列名[陣列大小] ---- c#:MarshalAs(UnmanagedType.ByValTStr, SizeConst = 陣列大小)] public string 陣列名; ushort

  //c++:char * ---- c#:string //傳入引數
  //c++:char * ---- c#:StringBuilder//傳出引數
  //c++:char *變數名 ---- c#:ref string 變數名
  //c++:char *輸入變數名 ---- c#:string 輸入變數名
  //c++:char *輸出變數名 ---- c#:[MarshalAs(UnmanagedType.LPStr)] StringBuilder 輸出變數名

  //c++:char ** ---- c#:string
  //c++:char **變數名 ---- c#:ref string 變數名
  //c++:const char * ---- c#:string
  //c++:char[] ---- c#:string
  //c++:char 變數名[陣列大小] ---- c#:[MarshalAs(UnmanagedType.ByValTStr,SizeConst=陣列大小)] public string 變數名; 

  //c++:struct 結構體名 *變數名 ---- c#:ref 結構體名 變數名
  //c++:委託 變數名 ---- c#:委託 變數名

  //c++:int ---- c#:int
  //c++:int ---- c#:ref int
  //c++:int & ---- c#:ref int
  //c++:int * ---- c#:ref int //C#中呼叫前需定義int 變數名 = 0;

  //c++:*int ---- c#:IntPtr
  //c++:int32 PIPTR * ---- c#:int32[]
  //c++:float PIPTR * ---- c#:float[]
   

  //c++:double** 陣列名 ---- c#:ref double 陣列名
  //c++:double*[] 陣列名 ---- c#:ref double 陣列名
  //c++:long ---- c#:int
  //c++:ulong ---- c#:int
    
  //c++:UINT8 * ---- c#:ref byte //C#中呼叫前需定義byte 變數名 = new byte();  


  //c++:handle ---- c#:IntPtr
  //c++:hwnd ---- c#:IntPtr
    
    
  //c++:void * ---- c#:IntPtr   
  //c++:void * user_obj_param ---- c#:IntPtr user_obj_param
  //c++:void * 物件名稱 ---- c#:([MarshalAs(UnmanagedType.AsAny)]Object 物件名稱


    
  //c++:char, INT8, SBYTE, CHAR ---- c#:System.SByte   
  //c++:short, short int, INT16, SHORT ---- c#:System.Int16   
  //c++:int, long, long int, INT32, LONG32, BOOL , INT ---- c#:System.Int32   
  //c++:__int64, INT64, LONGLONG ---- c#:System.Int64   
  //c++:unsigned char, UINT8, UCHAR , BYTE ---- c#:System.Byte   
  //c++:unsigned short, UINT16, USHORT, WORD, ATOM, WCHAR , __wchar_t ---- c#:System.UInt16   
  //c++:unsigned, unsigned int, UINT32, ULONG32, DWORD32, ULONG, DWORD, UINT ---- c#:System.UInt32   
  //c++:unsigned __int64, UINT64, DWORDLONG, ULONGLONG ---- c#:System.UInt64   
  //c++:float, FLOAT ---- c#:System.Single   
  //c++:double, long double, DOUBLE ---- c#:System.Double  

  //Win32 Types ---- CLR Type   
   

  //Struct需要在C#裡重新定義一個Struct
  //CallBack回撥函式需要封裝在一個委託裡,delegate static extern int FunCallBack(string str);

  //unsigned char** ppImage替換成IntPtr ppImage
  //int& nWidth替換成ref int nWidth
  //int*, int&, 則都可用 ref int 對應
  //雙針指型別引數,可以用 ref IntPtr
  //函式指標使用c++: typedef double (*fun_type1)(double); 對應 c#:public delegate double fun_type1(double);
  //char* 的操作c++: char*; 對應 c#:StringBuilder;
  //c#中使用指標:在需要使用指標的地方 加 unsafe


  //unsigned char對應public byte
  /*
  * typedef void (*CALLBACKFUN1W)(wchar_t*, void* pArg);
  * typedef void (*CALLBACKFUN1A)(char*, void* pArg);
  * bool BIOPRINT_SENSOR_API dllFun1(CALLBACKFUN1 pCallbackFun1, void* pArg);
  * 呼叫方式為
  * [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
  * public delegate void CallbackFunc1([MarshalAs(UnmanagedType.LPWStr)] StringBuilder strName, IntPtr pArg);
  *  
  *  
  */