Как мне конвертировать IntPtr в поток? - PullRequest
1 голос
/ 03 сентября 2008
class Foo
{
   static bool Bar(Stream^ stream);
};

class FooWrapper
{
   bool Bar(LPCWSTR szUnicodeString)
   {
       return Foo::Bar(??);
   }
};

MemoryStream потребуется byte[], но я бы хотел бы , чтобы сделать это без копирования данных, если это возможно.

Ответы [ 2 ]

7 голосов
/ 04 сентября 2008

Вы можете избежать копирования, если вместо этого используете UnmanagedMemoryStream() (класс существует в .NET FCL 2.0 и более поздних версиях). Как и MemoryStream, это подкласс IO.Stream и имеет все обычные потоковые операции.

Microsoft описывает класс:

Предоставляет доступ к неуправляемым блокам памяти из управляемого кода.

, который в значительной степени говорит вам, что вам нужно знать. Обратите внимание, что UnmanagedMemoryStream() не соответствует CLS.

0 голосов
/ 04 сентября 2008

Если бы мне пришлось скопировать память, я думаю, что будет работать следующее:


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);
}
...