Pregunta

class Foo
{
   static bool Bar(Stream^ stream);
};

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

MemoryStream va a tomar un byte[] pero me gustaría como para hacer esto sin necesidad de copiar los datos si es posible.

¿Fue útil?

Solución

Usted puede evitar la copia si el uso de un UnmanagedMemoryStream() en lugar de (clase existe en .NET FCL 2.0 y posteriores).Como MemoryStream, es una subclase de IO.Stream, y tiene toda la habitual secuencia de operaciones.

Microsoft, la descripción de la clase es:

Proporciona acceso a la falta de ordenación de los bloques de memoria de código administrado.

lo que casi dice lo que usted necesita saber.Tenga en cuenta que UnmanagedMemoryStream() no es compatible con CLS.

Otros consejos

Si tuviera que copiar la memoria, creo que el siguiente trabajo:


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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top