Frage

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

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

MemoryStream wird eine dauern byte[] aber ich würde wie Dies möglichst ohne Kopieren der Daten zu tun.

War es hilfreich?

Lösung

Sie können die Kopie vermeiden, wenn Sie eine verwenden UnmanagedMemoryStream() stattdessen (Klasse existiert in .NET FCL 2.0 und höher).Wie MemoryStream, es ist eine Unterklasse von IO.Stream, und verfügt über alle üblichen Stream-Operationen.

Microsofts Beschreibung der Klasse lautet:

Bietet Zugriff auf nicht verwaltete Speicherblöcke aus verwaltetem Code.

Das sagt Ihnen ziemlich genau, was Sie wissen müssen.Beachten Sie, dass UnmanagedMemoryStream() ist nicht CLS-kompatibel.

Andere Tipps

Wenn ich den Speicher kopieren müsste, würde meiner Meinung nach Folgendes funktionieren:


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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top