使C#.NET中的IntPtr指向字符串值

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中完成所有这些操作.


Han*_*ant 7

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

如果地址需要稳定一段时间,则非常喜欢复制.