我正在使用一个具有StringHandle
字段的类,该字段是在 C++IntPtr
中表示 a 的值
。LPCWSTR
internal IntPtr StringHandle; // LPCWSTR
现在说我有一个字符串:string x = "abcdefg"
如何使用 String 句柄指向 String 的开头,使其类似于 C++ LPCWSTR ?
您需要先将字符串复制到非托管内存,然后IntPtr
从该位置获取。你可以这样做:
IntPtr strPtr = Marshal.StringToHGlobalUni(x);
此外,您需要确保释放非托管内存:
Marshal.FreeHGlobal(strPtr);
最好在 try/finally 中完成所有这些。
当垃圾收集器压缩堆时,托管字符串在内存中移动。所以它们没有稳定的地址,不能直接转换为 LPCWSTR。您需要使用 GCHandle.Alloc() 固定字符串以使用 GCHandle.AddrOfPinnedObject 或使用 Marshal.StringToHGlobalUni() 将其复制到非托管内存中。
如果地址需要稳定一段时间,强烈建议复制。
您想在Marshal
类上使用 StringTo* 方法之一