Как мне преобразовать IntPtr в поток?
-
09-06-2019 - |
Вопрос
class Foo
{
static bool Bar(Stream^ stream);
};
class FooWrapper
{
bool Bar(LPCWSTR szUnicodeString)
{
return Foo::Bar(??);
}
};
MemoryStream
потребуется некоторое byte[]
но я бы Нравится сделать это, по возможности, без копирования данных.
Решение
Вы можете избежать копирования, если используете UnmanagedMemoryStream()
вместо этого (класс существует в .NET FCL 2.0 и более поздних версиях).Нравится MemoryStream
, это подкласс IO.Stream
, и выполняет все обычные потоковые операции.
Описание этого класса от Microsoft выглядит следующим образом:
Обеспечивает доступ к неуправляемым блокам памяти из управляемого кода.
это в значительной степени говорит вам о том, что вам нужно знать.Обратите внимание , что UnmanagedMemoryStream()
не соответствует CLS.
Другие советы
Если бы мне пришлось скопировать память, я думаю, сработало бы следующее:
static Stream^ UnicodeStringToStream(LPCWSTR szUnicodeString)
{
//validate the input parameter
if (szUnicodeString == NULL)
{
return nullptr;
}
//get the length of the string
size_t lengthInWChars = wcslen(szUnicodeString);
size_t lengthInBytes = lengthInWChars * sizeof(wchar_t);
//allocate the .Net byte array
array^ byteArray = gcnew array(lengthInBytes);
//copy the unmanaged memory into the byte array
Marshal::Copy((IntPtr)(void*)szUnicodeString, byteArray, 0, lengthInBytes);
//create a memory stream from the byte array
return gcnew MemoryStream(byteArray);
}
Не связан с StackOverflow