1. 字符串Marshalling基础

在本地代码中,字符串按编码可分为ASNI字符串和Unicode字符串,按实现不同,可分为LPSTR(char*,wchar*)和BSTR。

在托管代码中,与字符串相关的有String,stringBuilder两个。

 

为了实现本地代码与托管代码中字符串的相互转换,Marshalling 引入了几个属性值。

BSTR系列

UnmanagedType.AnsiBStr

UnmanagedType.BStr [COM Interop中为默认值]

UnmanagedTYpe.TBStr

LPSTR系列:

UnmanagedType.LPStr

UnmanagedType.LPWStr

UnmanagedType.LPTStr[批女哦棵中为默认值]

2.字符串的内存操作

  • LPString的内存操作:

本地代码相关函数:CoTaskMemAlloc,CoTaskMemFree

 

  • BSTR的内存操作:

本地代码相关函数:SysAllocString,SysFreeString

3. String和StringBuilder在Marshalling中的区别

在Marshalling中,如果你要传递的字符串仅仅需要在原有的字符串中改变某个或某几个字符(in-place change),在这种情况下,你就最好在托管代码中使用StringBuilder,而不是string。