Что вы ищете здесь я считаю, это призыв к ИАС вручную маршала от неуправляемого до управляемой памяти:
String myStr;
fixed (byte* pImageName = outBuffer)
{
var convertedArray = new byte[outLength];
System.Runtime.InteropServices.Marshal.Copy(new IntPtr(pImageName), convertedArray , 0, outLength);
myStr = System.Text.Encoding.UTF8.GetString(convertedArray);
}
Ключа к выше коде является вызовом маршала копии, которая двигается байты от неуправляемой до управляемой памяти. Вы захотите убедиться, что неуправляемая память доступна и имеет соответствующую длину, или вы можете получить некоторые очень неожиданные результаты.
Примечание
Как уже сказал, большую часть времени вы хотите, чтобы избежать указателей, когда это возможно. Если вы импортируете C++ или другую неуправляемую библиотеку, большую часть времени вы можете просто использовать тип «IntPtr» и разрешать .NET делать конверсии для вас. StringBuilder, как правило, также отображает указатель на символ C++ - опять же, надеюсь, вам не нужно будет использовать указатели. По сути, я понимаю, что interop-службы используют вызовы маршала внутри, поэтому при необходимости просматривайте этот интерфейс, и я думаю, вы должны найти то, что ищете.
Удачи вам!
Почему у вас есть указатель в первую очередь? Вы вообще не должны этого делать. – SLaks
Я думаю, что самый большой вопрос здесь - длина 'byte []'. Вам нужно увеличить указатель, чтобы получить весь массив. –