¿Cómo puedo convertir de un IntPtr a un Stream?
-
09-06-2019 - |
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.
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