Question

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

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

MemoryStream prendra un byte[] mais je le ferais comme pour le faire sans copier les données si possible.

Était-ce utile?

La solution

Vous pouvez éviter la copie si vous utilisez un UnmanagedMemoryStream() à la place (la classe existe dans .NET FCL 2.0 et versions ultérieures).Comme MemoryStream, c'est une sous-classe de IO.Stream, et a toutes les opérations de flux habituelles.

La description de la classe par Microsoft est la suivante :

Fournit l’accès aux blocs de mémoire non gérés à partir du code managé.

ce qui vous dit à peu près ce que vous devez savoir.Noter que UnmanagedMemoryStream() n'est pas conforme à CLS.

Autres conseils

Si je devais copier la mémoire, je pense que ce qui suit fonctionnerait :


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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top