将StringBuilder传递给PInvoke函数

在其中一篇标题为“调用c ++方法,返回一个字符串,来自c#”

它说,要使下面的Pinvoke工作,将C ++签名改为as

extern "C" REGISTRATION_API void calculate(LPSTR msg) 

C ++代码

 extern "C" REGISTRATION_API void calculate(char* msg) 

C#代码

 [DllImport("thecpp.dll", CharSet=CharSet.Ansi)] static extern void calculate(StringBuilder sMsg); 

如何将stringBuilder作为一个类,转换为long ptr为string。(但这是接受的答案)

难道我们不能使用IntPtr如下?

 extern "C" REGISTRATION_API void calculate(Intptr msg) 

寻找标记为“传递字符串”的部分,编组者已经有一些额外的智能来做这个技巧。
http://msdn.microsoft.com/en-us/library/aa446536.aspx

要在完整的.NET Framework中解决此问题(因为许多Win32 API需要字符串缓冲区),您可以传递一个System.Text.StringBuilder对象; 一个指针将由编组程序传递给可以操作的非托管函数。 唯一需要注意的是StringBuilder必须为返回值分配足够的空间,否则文本将溢出,导致P / Invoke抛出exception。