Make IntPtr в С#.NET указывает на строковое значение
Я использую класс, у которого есть поле StringHandle
, которое является значением IntPtr
, которое представляет собой
LPCWSTR
в С++.
internal IntPtr StringHandle; // LPCWSTR
скажите теперь, что у меня есть строка: string x = "abcdefg"
Как я могу использовать дескриптор String для указания на начало строки, чтобы он был похож на С++ LPCWSTR?
Ответы
Ответ 1
Сначала вам нужно скопировать строку в неуправляемую память, а затем получить IntPtr
из этого места. Вы можете сделать так:
IntPtr strPtr = Marshal.StringToHGlobalUni(x);
также необходимо освободить неуправляемую память:
Marshal.FreeHGlobal(strPtr);
лучше всего сделать это в попытке/наконец.
Ответ 2
Управляемые строки перемещаются в памяти, когда сборщик мусора сжимает кучу. Таким образом, они не имеют стабильного адреса и не могут быть напрямую переданы в LPCWSTR. Вам нужно будет либо связать строку с GCHandle.Alloc(), чтобы использовать GCHandle.AddrOfPinnedObject, либо скопировать ее в неуправляемую память с помощью Marshal.StringToHGlobalUni().
Сильно предпочитайте копировать, если на некоторое время адрес должен быть стабильным.
Ответ 3
Вы хотите использовать один из методов StringTo * в Marshal
class