可以说新手使用P-INVOKE最开始的头疼就是C#和C++的字符串传递,由于不同编程语言对字符串处理的机制不同,因此导致托管代码的平台调用必须对字符串进行特殊的封送处理。本节将阐述以下几个问题:
(1)、C#的string和C++的字符串首指针如何对应
(2)、字符串还有ANSI和UNICODE(宽字符串)之分
(3)、封送字符串数组
1、通过CharSet字段控制字符串封送行为:
C++:
void __cdecl TestString1(
char* hello
);
void __cdecl TestString2(const wchar_t* str,wchar_t* outStr,int size);
MSDN上给出C/C++字符串类型与C#字符串类型的对应关系
Wtypes.h 中的非托管类型
非托管C/C++
语言类型
托管类名
说明
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 修饰。
C#
[DllImport("test.dll", EntryPoint = "TestString1", CharSet =CharSet.Ansi)]
public static extern voidTestString1(string
hello
);[DllImport("test.dll", EntryPoint = "TestString1", CharSet =CharSet.Unicode)]
public static extern voidTestString2(stringstr,StringBuilder outStr,int siz