20

我正在使用一个具有StringHandle字段的类,该字段是在 C++IntPtr中表示 a 的值 。LPCWSTR

internal IntPtr StringHandle; // LPCWSTR

现在说我有一个字符串:string x = "abcdefg"

如何使用 String 句柄指向 String 的开头,使其类似于 C++ LPCWSTR ?

4

3 回答 3

35

您需要先将字符串复制到非托管内存,然后IntPtr从该位置获取。你可以这样做:

IntPtr strPtr = Marshal.StringToHGlobalUni(x);

此外,您需要确保释放非托管内存:

Marshal.FreeHGlobal(strPtr);

最好在 try/finally 中完成所有这些。

于 2012-06-18T20:25:25.913 回答
7

当垃圾收集器压缩堆时,托管字符串在内存中移动。所以它们没有稳定的地址,不能直接转换为 LPCWSTR。您需要使用 GCHandle.Alloc() 固定字符串以使用 GCHandle.AddrOfPinnedObject 或使用 Marshal.StringToHGlobalUni() 将其复制到非托管内存中。

如果地址需要稳定一段时间,强烈建议复制。

于 2012-06-18T20:29:55.280 回答
1

您想在Marshal类上使用 StringTo* 方法之一

于 2012-06-18T20:23:26.620 回答