C# 调用 C++ DLL(2) 非托管方式:直接调用C++方法(类型转换)

extern"C"__declspec(dllexport)bool方法名一(constchar*变量名1,unsignedchar*变量名2)
extern"C"__declspec(dllexport)bool方法名二(constunsignedchar*变量名1,char*变量名2)
C#调用C++的DLL搜集整理的所有数据类型转换方式,可能会有重复或者多种方案,自己多测试
c++: HANDLE(void*) | c#: System.IntPtr
c++: Byte(unsignedchar) | c#: System.Byte
c++: SHORT(short) | c#: System.Int16
c++: WORD(unsignedshort) | c#: System.UInt16
c++: INT(int) | c#: System.Int16
c++: INT(int) | c#: System.Int32
c++: UINT(unsignedint) | c#: System.UInt16
c++: UINT(unsignedint) | c#: System.UInt32
c++: LONG(long) | c#: System.Int32
c++: ULONG(unsignedlong) | c#: System.UInt32
c++: DWORD(unsignedlong) | 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(constchar*) | c#: System.String
c++: LPCWSTR(constwchar_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#: publicstruct结构体{};
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++: unsignedchar | c#: byte
c++: unsignedchar* | c#: refbyte
c++: unsignedchar* | c#: [MarshalAs(UnmanagedType.LPArray)]byte[]
c++: unsignedchar* | c#: [MarshalAs(UnmanagedType.LPArray)]Intptr
c++: unsignedchar& | c#: refbyte
c++: unsignedchar变量名 | c#: byte变量名
c++: unsignedshort变量名 | c#: ushort变量名
c++: unsignedint变量名 | c#: uint变量名
c++: unsignedlong变量名 | c#: ulong变量名
c++: char变量名 | c#: byte变量名C++中一个字符用一个字节表示,C#中一个字符用两个字节表示
c++: char数组名[数组大小] | c#: MarshalAs(UnmanagedType.ByValTStr,SizeConst=数组大小)]publicstring数组名;ushort
c++: char* | c#: string传入参数
c++: char* | c#: StringBuilder传出参数
c++: char*变量名 | c#: refstring变量名
c++: char*输入变量名 | c#: string输入变量名
c++: char*输出变量名 | c#: [MarshalAs(UnmanagedType.LPStr)]StringBuilder输出变量名
c++: char** | c#: string
c++: char**变量名 | c#: refstring变量名
c++: constchar* | c#: string
c++: char[] | c#: string
c++: char变量名[数组大小] | c#: [MarshalAs(UnmanagedType.ByValTStr,SizeConst=数组大小)]publicstring变量名;
c++: struct结构体名*变量名 | c#: ref结构体名变量名
c++: 委托变量名 | c#: 委托变量名
c++: int | c#: int
c++: int | c#: refint
c++: int& | c#: refint
c++: int* | c#: refintC#中调用前需定义int变量名=0;
c++: *int | c#: IntPtr
c++: int32PIPTR* | c#: int32[]
c++: floatPIPTR* | c#: float[]
c++: double**数组名 | c#: refdouble数组名
c++: double*[]数组名 | c#: refdouble数组名
c++: long | c#: int
c++: ulong | c#: int
c++: UINT8* | c#: refbyteC#中调用前需定义byte变量名=newbyte();
c++: handle | c#: IntPtr
c++: hwnd | c#: IntPtr
c++: void* | c#: IntPtr
c++: void*user_obj_param | c#: IntPtruser_obj_param
c++: void*对象名称 | c#: ([MarshalAs(UnmanagedType.AsAny)]Object对象名称
c++: char,INT8,SBYTE,CHAR | c#: System.SByte
c++: short,shortint,INT16,SHORT | c#: System.Int16
c++: int,long,longint,INT32,LONG32,BOOL,INT | c#: System.Int32
c++: __int64,INT64,LONGLONG | c#: System.Int64
c++: unsignedchar,UINT8,UCHAR,BYTE | c#: System.Byte
c++: unsignedshort,UINT16,USHORT,WORD,ATOM,WCHAR,__wchar_t | c#: System.UInt16
c++: unsigned,unsignedint,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,longdouble,DOUBLE | c#: System.Double
Win32Types----CLRType
Struct需要在C#里重新定义一个Struct
CallBack回调函数需要封装在一个委托里,delegatestaticexternintFunCallBack(stringstr);
unsignedchar**ppImage替换成IntPtrppImage
int&nWidth替换成refintnWidth
int*,int&,则都可用refint对应
双针指类型参数,可以用refIntPtr
函数指针使用c++: typedefdouble(*fun_type1)(double);对应c#:publicdelegatedoublefun_type1(double);
char*的操作c++: char*;对应c#:StringBuilder;
c#中使用指针:在需要使用指针的地方加unsafe

猜你喜欢

转载自blog.csdn.net/stwuyiyu/article/details/78191537