Freigeben über


UnmanagedMemoryStream Konstruktoren

Definition

Initialisiert eine neue Instanz der UnmanagedMemoryStream Klasse.

Überlädt

UnmanagedMemoryStream()

Initialisiert eine neue Instanz der UnmanagedMemoryStream Klasse.

UnmanagedMemoryStream(Byte*, Int64)

Initialisiert eine neue Instanz der UnmanagedMemoryStream Klasse mithilfe des angegebenen Speicherorts und der angegebenen Speicherlänge.

UnmanagedMemoryStream(SafeBuffer, Int64, Int64)

Initialisiert eine neue Instanz der UnmanagedMemoryStream Klasse in einem sicheren Puffer mit einem angegebenen Offset und einer angegebenen Länge.

UnmanagedMemoryStream(Byte*, Int64, Int64, FileAccess)

Initialisiert eine neue Instanz der UnmanagedMemoryStream Klasse unter Verwendung des angegebenen Speicherorts, der Arbeitsspeicherlänge, der Gesamtmenge des Arbeitsspeichers und der Dateizugriffswerte.

UnmanagedMemoryStream(SafeBuffer, Int64, Int64, FileAccess)

Initialisiert eine neue Instanz der UnmanagedMemoryStream-Klasse in einem sicheren Puffer mit einem angegebenen Offset, einer bestimmten Länge und einem Dateizugriff.

UnmanagedMemoryStream()

Quelle:
UnmanagedMemoryStream.cs
Quelle:
UnmanagedMemoryStream.cs
Quelle:
UnmanagedMemoryStream.cs

Initialisiert eine neue Instanz der UnmanagedMemoryStream Klasse.

protected:
 UnmanagedMemoryStream();
protected UnmanagedMemoryStream ();
Protected Sub New ()

Ausnahmen

Der Benutzer verfügt nicht über die erforderliche Berechtigung.

Gilt für:

UnmanagedMemoryStream(Byte*, Int64)

Quelle:
UnmanagedMemoryStream.cs
Quelle:
UnmanagedMemoryStream.cs
Quelle:
UnmanagedMemoryStream.cs

Wichtig

Diese API ist nicht CLS-kompatibel.

Initialisiert eine neue Instanz der UnmanagedMemoryStream Klasse mithilfe des angegebenen Speicherorts und der angegebenen Speicherlänge.

public:
 UnmanagedMemoryStream(System::Byte* pointer, long length);
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
public UnmanagedMemoryStream (byte* pointer, long length);
[System.CLSCompliant(false)]
public UnmanagedMemoryStream (byte* pointer, long length);
public UnmanagedMemoryStream (byte* pointer, long length);
[<System.CLSCompliant(false)>]
[<System.Security.SecurityCritical>]
new System.IO.UnmanagedMemoryStream : nativeptr<byte> * int64 -> System.IO.UnmanagedMemoryStream
[<System.CLSCompliant(false)>]
new System.IO.UnmanagedMemoryStream : nativeptr<byte> * int64 -> System.IO.UnmanagedMemoryStream
new System.IO.UnmanagedMemoryStream : nativeptr<byte> * int64 -> System.IO.UnmanagedMemoryStream

Parameter

pointer
Byte*

Ein Zeiger auf einen nicht verwalteten Speicherspeicherort.

length
Int64

Die Länge des zu verwendenden Arbeitsspeichers.

Attribute

Ausnahmen

Der Benutzer verfügt nicht über die erforderliche Berechtigung.

Der wert pointer ist null.

Der length Wert ist kleiner als 0.

-oder-

Die length ist groß genug, um einen Überlauf zu verursachen.

Beispiele

Im folgenden Codebeispiel wird das Lesen und Schreiben in nicht verwalteten Arbeitsspeicher mithilfe der UnmanagedMemoryStream Klasse veranschaulicht. Ein Block des nicht verwalteten Speichers wird mithilfe der Marshal-Klasse zugewiesen und aufgehoben.

// Note: You must compile this sample using the unsafe flag.
// From the command line, type the following: csc sample.cs /unsafe
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;

unsafe class Program
{
    static void Main()
    {
        // Create some data to write.
        byte[] text = UnicodeEncoding.Unicode.GetBytes("Data to write.");

        // Allocate a block of unmanaged memory.
        IntPtr memIntPtr = Marshal.AllocHGlobal(text.Length);

        // Get a byte pointer from the unmanaged memory block.
        byte* memBytePtr = (byte*)memIntPtr.ToPointer();

        UnmanagedMemoryStream writeStream =
            new UnmanagedMemoryStream(
            memBytePtr, text.Length, text.Length, FileAccess.Write);

        // Write the data.
        WriteToStream(writeStream, text);

        // Close the stream.
        writeStream.Close();

        // Create another UnmanagedMemoryStream for reading.
        UnmanagedMemoryStream readStream =
            new UnmanagedMemoryStream(memBytePtr, text.Length);

        // Display the contents of the stream to the console.
        PrintStream(readStream);

        // Close the reading stream.
        readStream.Close();

        // Free up the unmanaged memory.
        Marshal.FreeHGlobal(memIntPtr);
    }

    public static void WriteToStream(UnmanagedMemoryStream writeStream, byte[] text)
    {
        // Verify that the stream is writable:
        // By default, UnmanagedMemoryStream objects do not have write access,
        // write access must be set explicitly.
        if (writeStream.CanWrite)
        {
            // Write the data, byte by byte
            for (int i = 0; i < writeStream.Length; i++)
            {
                writeStream.WriteByte(text[i]);
            }
        }
    }

    public static void PrintStream(UnmanagedMemoryStream readStream)
    {
        byte[] text = new byte[readStream.Length];
        // Verify that the stream is writable:
        // By default, UnmanagedMemoryStream objects do not have write access,
        // write access must be set explicitly.
        if (readStream.CanRead)
        {
            // Write the data, byte by byte
            for (int i = 0; i < readStream.Length; i++)
            {
                text[i] = (byte)readStream.ReadByte();
            }
        }

        Console.WriteLine(UnicodeEncoding.Unicode.GetString(text));
    }
}

Hinweise

Dieser Konstruktor erstellt eine neue Instanz der UnmanagedMemoryStream Klasse und legt standardmäßig die eigenschaft CanWrite auf false und die eigenschaft CanRead auf truefest. Die Length-Eigenschaft wird auf den Wert des length Parameters festgelegt und kann nicht geändert werden.

Gilt für:

UnmanagedMemoryStream(SafeBuffer, Int64, Int64)

Quelle:
UnmanagedMemoryStream.cs
Quelle:
UnmanagedMemoryStream.cs
Quelle:
UnmanagedMemoryStream.cs

Initialisiert eine neue Instanz der UnmanagedMemoryStream Klasse in einem sicheren Puffer mit einem angegebenen Offset und einer angegebenen Länge.

public:
 UnmanagedMemoryStream(System::Runtime::InteropServices::SafeBuffer ^ buffer, long offset, long length);
public UnmanagedMemoryStream (System.Runtime.InteropServices.SafeBuffer buffer, long offset, long length);
new System.IO.UnmanagedMemoryStream : System.Runtime.InteropServices.SafeBuffer * int64 * int64 -> System.IO.UnmanagedMemoryStream
Public Sub New (buffer As SafeBuffer, offset As Long, length As Long)

Parameter

buffer
SafeBuffer

Der Puffer, der den nicht verwalteten Speicherdatenstrom enthält.

offset
Int64

Die Byteposition im Puffer, an der der nicht verwaltete Speicherdatenstrom gestartet werden soll.

length
Int64

Die Länge des nicht verwalteten Speicherdatenstroms.

Gilt für:

UnmanagedMemoryStream(Byte*, Int64, Int64, FileAccess)

Quelle:
UnmanagedMemoryStream.cs
Quelle:
UnmanagedMemoryStream.cs
Quelle:
UnmanagedMemoryStream.cs

Wichtig

Diese API ist nicht CLS-kompatibel.

Initialisiert eine neue Instanz der UnmanagedMemoryStream Klasse unter Verwendung des angegebenen Speicherorts, der Arbeitsspeicherlänge, der Gesamtmenge des Arbeitsspeichers und der Dateizugriffswerte.

public:
 UnmanagedMemoryStream(System::Byte* pointer, long length, long capacity, System::IO::FileAccess access);
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
public UnmanagedMemoryStream (byte* pointer, long length, long capacity, System.IO.FileAccess access);
[System.CLSCompliant(false)]
public UnmanagedMemoryStream (byte* pointer, long length, long capacity, System.IO.FileAccess access);
public UnmanagedMemoryStream (byte* pointer, long length, long capacity, System.IO.FileAccess access);
[<System.CLSCompliant(false)>]
[<System.Security.SecurityCritical>]
new System.IO.UnmanagedMemoryStream : nativeptr<byte> * int64 * int64 * System.IO.FileAccess -> System.IO.UnmanagedMemoryStream
[<System.CLSCompliant(false)>]
new System.IO.UnmanagedMemoryStream : nativeptr<byte> * int64 * int64 * System.IO.FileAccess -> System.IO.UnmanagedMemoryStream
new System.IO.UnmanagedMemoryStream : nativeptr<byte> * int64 * int64 * System.IO.FileAccess -> System.IO.UnmanagedMemoryStream

Parameter

pointer
Byte*

Ein Zeiger auf einen nicht verwalteten Speicherspeicherort.

length
Int64

Die Länge des zu verwendenden Arbeitsspeichers.

capacity
Int64

Die Gesamtmenge des Arbeitsspeichers, der dem Datenstrom zugewiesen ist.

access
FileAccess

Einer der FileAccess Werte.

Attribute

Ausnahmen

Der Benutzer verfügt nicht über die erforderliche Berechtigung.

Der wert pointer ist null.

Der length Wert ist kleiner als 0.

-oder-

Der capacity Wert ist kleiner als 0.

-oder-

Der length Wert ist größer als der capacity Wert.

Beispiele

Im folgenden Codebeispiel wird das Lesen und Schreiben in nicht verwalteten Arbeitsspeicher mithilfe der UnmanagedMemoryStream Klasse veranschaulicht. Ein Block des nicht verwalteten Speichers wird mithilfe der Marshal-Klasse zugewiesen und aufgehoben.


// Note: you must compile this sample using the unsafe flag.
// From the command line, type the following: csc sample.cs /unsafe

using System;
using System.IO;
using System.Text;
using System.Runtime.InteropServices;

unsafe class TestWriter
{
    static void Main()
    {
        // Create some data to read and write.
        byte[] message = UnicodeEncoding.Unicode.GetBytes("Here is some data.");

        // Allocate a block of unmanaged memory and return an IntPtr object.	
        IntPtr memIntPtr = Marshal.AllocHGlobal(message.Length);

        // Get a byte pointer from the IntPtr object.
        byte* memBytePtr = (byte*)memIntPtr.ToPointer();

        // Create an UnmanagedMemoryStream object using a pointer to unmanaged memory.
        UnmanagedMemoryStream writeStream = new UnmanagedMemoryStream(memBytePtr, message.Length, message.Length, FileAccess.Write);

        // Write the data.
        writeStream.Write(message, 0, message.Length);

        // Close the stream.
        writeStream.Close();

        // Create another UnmanagedMemoryStream object using a pointer to unmanaged memory.
        UnmanagedMemoryStream readStream = new UnmanagedMemoryStream(memBytePtr, message.Length, message.Length, FileAccess.Read);

        // Create a byte array to hold data from unmanaged memory.
        byte[] outMessage = new byte[message.Length];

        // Read from unmanaged memory to the byte array.
        readStream.Read(outMessage, 0, message.Length);

        // Close the stream.
        readStream.Close();

        // Display the data to the console.
        Console.WriteLine(UnicodeEncoding.Unicode.GetString(outMessage));

        // Free the block of unmanaged memory.
        Marshal.FreeHGlobal(memIntPtr);

        Console.ReadLine();
    }
}

Hinweise

Der parameter length definiert die aktuelle Menge des verwendeten Arbeitsspeichers. Wenn Sie Daten an den Datenstrom lesen oder anfügen, sollte der length Wert der Menge gültiger Daten im Datenstrom entsprechen, aus der gelesen oder beibehalten werden soll. Wenn Sie in den Datenstrom schreiben, sollte dieser Wert null sein.

Der parameter capacity gibt die Menge des verfügbaren Gesamtspeichers an. Dieser Wert kann einen Bereich beschreiben, der länger als die angegebene Länge ist, oder einen Bereich angeben, der angefügt werden kann. Jeder Versuch, über diesen Wert hinaus zu schreiben, schlägt fehl.

Der parameter access legt die eigenschaften CanReadund CanWrite fest. Beachten Sie, dass das Angeben von Write nicht garantiert, dass der Datenstrom schreibbar ist. Mit den Zugriffsparametern kann der Implementierer ein Objekt erstellen, dessen Implementierung mit dem tatsächlich verfügbar gemachten Datenstrom übereinstimmen kann.

Gilt für:

UnmanagedMemoryStream(SafeBuffer, Int64, Int64, FileAccess)

Quelle:
UnmanagedMemoryStream.cs
Quelle:
UnmanagedMemoryStream.cs
Quelle:
UnmanagedMemoryStream.cs

Initialisiert eine neue Instanz der UnmanagedMemoryStream-Klasse in einem sicheren Puffer mit einem angegebenen Offset, einer bestimmten Länge und einem Dateizugriff.

public:
 UnmanagedMemoryStream(System::Runtime::InteropServices::SafeBuffer ^ buffer, long offset, long length, System::IO::FileAccess access);
public UnmanagedMemoryStream (System.Runtime.InteropServices.SafeBuffer buffer, long offset, long length, System.IO.FileAccess access);
new System.IO.UnmanagedMemoryStream : System.Runtime.InteropServices.SafeBuffer * int64 * int64 * System.IO.FileAccess -> System.IO.UnmanagedMemoryStream
Public Sub New (buffer As SafeBuffer, offset As Long, length As Long, access As FileAccess)

Parameter

buffer
SafeBuffer

Der Puffer, der den nicht verwalteten Speicherdatenstrom enthält.

offset
Int64

Die Byteposition im Puffer, an der der nicht verwaltete Speicherdatenstrom gestartet werden soll.

length
Int64

Die Länge des nicht verwalteten Speicherdatenstroms.

access
FileAccess

Der Modus des Dateizugriffs auf den nicht verwalteten Speicherdatenstrom.

Gilt für: