Comment convertir un IntPtr en Stream ?
-
09-06-2019 - |
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.
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