UnmanagedMemoryStream Konstruktory

Definicja

Inicjuje nowe wystąpienie klasy UnmanagedMemoryStream.

Przeciążenia

UnmanagedMemoryStream()

Inicjuje nowe wystąpienie klasy UnmanagedMemoryStream.

UnmanagedMemoryStream(Byte*, Int64)

Inicjuje UnmanagedMemoryStream nowe wystąpienie klasy przy użyciu określonej lokalizacji i długości pamięci.

UnmanagedMemoryStream(SafeBuffer, Int64, Int64)

Inicjuje nowe wystąpienie UnmanagedMemoryStream klasy w bezpiecznym buforze z określonym przesunięciem i długością.

UnmanagedMemoryStream(Byte*, Int64, Int64, FileAccess)

Inicjuje UnmanagedMemoryStream nowe wystąpienie klasy przy użyciu określonej lokalizacji, długości pamięci, całkowitej ilości pamięci i wartości dostępu do plików.

UnmanagedMemoryStream(SafeBuffer, Int64, Int64, FileAccess)

Inicjuje nowe wystąpienie UnmanagedMemoryStream klasy w bezpiecznym buforze z określonym przesunięciem, długością i dostępem do plików.

UnmanagedMemoryStream()

Inicjuje nowe wystąpienie klasy UnmanagedMemoryStream.

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

Wyjątki

Użytkownik nie ma wymaganych uprawnień.

Dotyczy

UnmanagedMemoryStream(Byte*, Int64)

Ważne

Ten interfejs API nie jest zgodny ze specyfikacją CLS.

Inicjuje UnmanagedMemoryStream nowe wystąpienie klasy przy użyciu określonej lokalizacji i długości pamięci.

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

Parametry

pointer
Byte*

Wskaźnik do niezarządzanej lokalizacji pamięci.

length
Int64

Długość pamięci do użycia.

Atrybuty

Wyjątki

Użytkownik nie ma wymaganych uprawnień.

Wartość elementu pointer to null.

Wartość length jest mniejsza niż zero.

-lub- Wartość length jest wystarczająco duża, aby spowodować przepełnienie.

Przykłady

W poniższym przykładzie kodu pokazano, jak odczytywać dane z niezarządzanej pamięci i zapisywać je przy UnmanagedMemoryStream użyciu klasy . Blok niezarządzanej pamięci jest przydzielany i delokowany przy użyciu Marshal klasy .

// 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));
    }
}

Uwagi

Ten konstruktor tworzy nowe wystąpienie UnmanagedMemoryStream klasy, a domyślnie ustawia CanWrite właściwość na false , a właściwość na CanRead true. Właściwość Length jest ustawiona na wartość parametru length i nie można jej zmienić.

Dotyczy

UnmanagedMemoryStream(SafeBuffer, Int64, Int64)

Inicjuje nowe wystąpienie UnmanagedMemoryStream klasy w bezpiecznym buforze z określonym przesunięciem i długością.

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)

Parametry

buffer
SafeBuffer

Bufor zawierający niezarządzany strumień pamięci.

offset
Int64

Pozycja bajtów w buforze, w którym ma być uruchamiany niezarządzany strumień pamięci.

length
Int64

Długość niezarządzanego strumienia pamięci.

Dotyczy

UnmanagedMemoryStream(Byte*, Int64, Int64, FileAccess)

Ważne

Ten interfejs API nie jest zgodny ze specyfikacją CLS.

Inicjuje UnmanagedMemoryStream nowe wystąpienie klasy przy użyciu określonej lokalizacji, długości pamięci, całkowitej ilości pamięci i wartości dostępu do plików.

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

Parametry

pointer
Byte*

Wskaźnik do niezarządzanej lokalizacji pamięci.

length
Int64

Długość pamięci do użycia.

capacity
Int64

Całkowita ilość pamięci przypisanej do strumienia.

access
FileAccess

FileAccess Jedna z wartości.

Atrybuty

Wyjątki

Użytkownik nie ma wymaganych uprawnień.

Wartość elementu pointer to null.

Wartość length jest mniejsza niż zero.

-lub- Wartość capacity jest mniejsza niż zero.

-lub- Wartość length jest większa niż capacity wartość.

Przykłady

W poniższym przykładzie kodu pokazano, jak odczytywać dane z niezarządzanej pamięci i zapisywać je przy UnmanagedMemoryStream użyciu klasy . Blok niezarządzanej pamięci jest przydzielany i delokowany przy użyciu Marshal klasy .


// 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();
    }
}

Uwagi

Parametr length definiuje bieżącą ilość używanej pamięci. W przypadku odczytywania lub dołączania danych do strumienia length wartość powinna być równa ilości prawidłowych danych w strumieniu do odczytu lub zachowania. W przypadku zapisywania w strumieniu ta wartość powinna być równa zero.

Parametr capacity wskazuje łączną ilość dostępnej pamięci. Ta wartość może opisywać region, który jest dłuższy niż określona długość, lub wskazać region, do którego można dołączyć. Próba zapisania poza tą wartością zakończy się niepowodzeniem.

Parametr access ustawia CanReadwłaściwości , i CanWrite . Należy pamiętać, że określenie Write nie gwarantuje, że strumień będzie zapisywalny. Parametry dostępu umożliwiają implementatorowi utworzenie obiektu, którego implementacja może być zgodna z rzeczywistym strumieniem, który jest uwidoczniony.

Dotyczy

UnmanagedMemoryStream(SafeBuffer, Int64, Int64, FileAccess)

Inicjuje nowe wystąpienie UnmanagedMemoryStream klasy w bezpiecznym buforze z określonym przesunięciem, długością i dostępem do plików.

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)

Parametry

buffer
SafeBuffer

Bufor zawierający niezarządzany strumień pamięci.

offset
Int64

Pozycja bajtów w buforze, w którym ma być uruchamiany niezarządzany strumień pamięci.

length
Int64

Długość niezarządzanego strumienia pamięci.

access
FileAccess

Tryb dostępu do pliku do niezarządzanego strumienia pamięci.

Dotyczy