2008-09-03 14 views

Antwort

6

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

Microsofts Beschreibung der Klasse ist:

Ermöglicht den Zugriff auf nicht verwalteten Speicherblöcke von verwalteten Code.

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

+0

Hinweis: Diese Antwort funktioniert nur in unsicheren Code. Wenn Sie nicht mit dem unsicheren Flag kompilieren, haben Sie möglicherweise mehr Glück, indem Sie die Daten an ein Byte-Array matrailhaltieren und dieses Byte-Array dann in einen Stream einschließen. Siehe hier: http://stackoverflow.com/a/11660831/684852 Sie müssen jedoch die Länge der Daten (Anzahl der Bytes in der ursprünglichen Unicode-Zeichenfolge an Ihrem Zeiger) wissen. Zum Beispiel: 'byte [] dataArray = neues Byte [dataLength]; Marshal.Copy (szUnicodeString, dataArray, 0, dataLength); MemoryStream stream = neuer MemoryStream (dataArray); ' –

1

Wenn ich den Speicher zu kopieren hatte, denke ich folgendes funktionieren würde:


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); 
}
Verwandte Themen