Sah*_*wal 18 .net c# interop pointers
我正在使用一个具有StringHandle字段的类,该字段IntPtr表示LPCWSTR在C++中的值
.
internal IntPtr StringHandle; // LPCWSTR
Run Code Online (Sandbox Code Playgroud)
现在说我有一个字符串: string x = "abcdefg"
如何使用String句柄指向String的开头,以便它像C++ LPCWSTR?
Ere*_*mez 32
您需要先将字符串复制到非托管内存,然后IntPtr从该位置获取.你可以这样做:
IntPtr strPtr = Marshal.StringToHGlobalUni(x);
Run Code Online (Sandbox Code Playgroud)
另外,您需要确保释放非托管内存:
Marshal.FreeHGlobal(strPtr);
Run Code Online (Sandbox Code Playgroud)
最好在try/finally中完成所有这些操作.
当垃圾收集器压缩堆时,托管字符串在内存中移动.因此,它们没有稳定的地址,也无法直接转换为LPCWSTR.您需要使用GCHandle.Alloc()将字符串固定以使用GCHandle.AddrOfPinnedObject,或使用Marshal.StringToHGlobalUni()将其复制到非托管内存中.
如果地址需要稳定一段时间,则非常喜欢复制.