1. 程式人生 > 其它 >C#引用C++的DLL時C#和C++的資料型別對照表

C#引用C++的DLL時C#和C++的資料型別對照表

C#呼叫 非託管C++ dll 傳入Stringbuilder、ref string 、 ref char 等都報錯,如mscorlib.dll 異常、其他資訊: 嘗試讀取或寫入受保護的記憶體。這通常指示其他記憶體已損壞 等等,後來發現是dll 生成後一直沒更新,放錯位置了。。。 = =||

不過也學習了一下編譯器及型別相關的知識,整理如下: 1、 cl.exe /Gz 引數指定編譯為 __stdcall 呼叫方式,預設為 __cdecl2、C#中的char是兩個位元組http://msdn.microsoft.com/zh-cn/library/x9h8tsay(v=vs.80).aspx 類型範圍大小.NET Framework 型別charU+0000 到 U+ffff16 位 Unicode 字元System.Char
型別 範圍 大小 .NET Framework 型別 byte 0 到 255 無符號 8 位整數 System.Byte 3、C++ dll 型別與 C#型別對應關係參考:本以為這篇蒐集整理的程式碼會是很不錯的文章,花了一天時間,搜尋到最後居然出來一篇叫做"C# 與 C++ 資料型別對照表"的文章.幾乎囊括掉和大部分的資料了,太打擊我了. 本文中有部分的資料沒有測試.也有一些不錯的是看了上百篇網文對比整理得來的.希望有幫助. //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
————————————————
版權宣告:本文為CSDN博主「都是木頭」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/dhl11/article/details/120063649