C++和C# 的字符串传递问题
C++定义,要传出字符串 name
void __stdcall getName(int slave, char* name);
代码: strcpy(name, adapter->name); 用 strcpy 复制修改字符串数据
C#定义
[DllImport("lib.dll")]
extern public static void getName(int index, StringBuilder name);
网上都是这么说的,我也是这么用的,可是还是崩了,为什么??
重点是:
默认: StringBuilder sb = new StringBuilder(); 默认 sb.Capacity = 16 ,缓冲区长度不够,结果还是会造成溢出
要修改成这样: StringBuilder sb = new StringBuilder(1024); 要保证缓冲区足够大,避免溢出
也可以这么定义:
[DllImport("lib.dll")]
extern public static void getName(int index, byte[] name);
代码这么写:
byte[] bts = new byte[1024];
getName(0, bts);
string ss = System.Text.Encoding.Default.GetString(bts);
ss = ss.Trim('\0');
代码太多,太麻烦了
如果是直接返回的字符串,如这样:
C++
char* __stdcall getName(int index);
C#
[DllImport("soemlib.dll", CharSet = CharSet.Ansi)]
extern public static IntPtr getName(int index);
代码里这么用:
IntPtr pStr= getName(0);
string ss = Marshal.PtrToStringAnsi(pStr);
注意,CharSet.Ansi 和 PtrToStringAnsi 相对应,CharSet.Unicode --> PtrToStringUni