C#與C++類型對應關係總結

Windows Data Type

.NET Data Type

BOOL, BOOLEAN

Boolean or Int32

BSTR

String

BYTE

Byte

CHAR

Char

DOUBLE

Double

DWORD

Int32 or UInt32

FLOAT

Single

HANDLE (and all other handle types, such as HFONT and HMENU)

IntPtr, UintPtr or HandleRef

HRESULT

Int32 or UInt32

INT

Int32

LANGID

Int16 or UInt16

LCID

Int32 or UInt32

LONG

Int32

LPARAM

IntPtr, UintPtr or Object

LPCSTR

String

LPCTSTR

String

LPCWSTR

String

LPSTR

String or StringBuilder*

LPTSTR

String or StringBuilder

LPWSTR

String or StringBuilder

LPVOID

IntPtr, UintPtr or Object

LRESULT

IntPtr

SAFEARRAY

.NET array type

SHORT

Int16

TCHAR

Char

UCHAR

SByte

UINT

Int32 or UInt32

ULONG

Int32 or UInt32

VARIANT

Object

VARIANT_BOOL

Boolean

WCHAR

Char

WORD

Int16 or UInt16

WPARAM

IntPtr, UintPtr or Object

另: 在進行string轉換時,需要加入前綴[MarshalAs(UnmanagedType.LPStr)]lpdword 對應於 ref int

 

 

C/C++

C#

HANDLE, LPDWORD, LPVOID, void*

IntPtr

LPCTSTR, LPCTSTR, LPSTR, char*, const char*, Wchar_t*, LPWSTR

String [in], StringBuilder [in, out]

DWORD, unsigned long, Ulong

UInt32, [MarshalAs(UnmanagedType.U4)]

bool

bool

LP<struct>

[In] ref <struct>

SIZE_T

uint

LPDWORD

out uint

LPTSTR

[Out] StringBuilder

PULARGE_INTEGER

out ulong

WORD

uInt16

Byte, unsigned char

byte

Short

Int16

Long, int

Int32

float

single

double

double

NULL pointer

IntPtr.Zero

Uint

Uint32

 

C#調用DLL文件時參數對應表

Wtypes.h 中的非託管類型

非託管 C 語言類型

託管類名

說明

HANDLE

void*

System.IntPtr

在 32 位 Windows 操作系統上爲 32 位,在 64 位 Windows 操作系統上爲 64 位。

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.Text.StringBuilder

用 ANSI 修飾。

LPCSTR

Const char*

System.String 或   System.Text.StringBuilder

用 ANSI 修飾。

LPWSTR

wchar_t*

System.String 或   System.Text.StringBuilder

用 Unicode 修飾。

LPCWSTR

Const wchar_t*

System.String 或   System.Text.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);
  *  
  */


發佈了81 篇原創文章 · 獲贊 104 · 訪問量 131萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章