Bagikan melalui


UnmanagedMemoryStream Konstruktor

Definisi

Menginisialisasi instans baru kelas UnmanagedMemoryStream.

Overload

UnmanagedMemoryStream()

Menginisialisasi instans baru kelas UnmanagedMemoryStream.

UnmanagedMemoryStream(Byte*, Int64)

Menginisialisasi instans baru kelas UnmanagedMemoryStream menggunakan lokasi dan panjang memori yang ditentukan.

UnmanagedMemoryStream(SafeBuffer, Int64, Int64)

Menginisialisasi instans baru kelas UnmanagedMemoryStream dalam buffer aman dengan offset dan panjang yang ditentukan.

UnmanagedMemoryStream(Byte*, Int64, Int64, FileAccess)

Menginisialisasi instans baru kelas UnmanagedMemoryStream menggunakan lokasi, panjang memori, jumlah total memori, dan nilai akses file yang ditentukan.

UnmanagedMemoryStream(SafeBuffer, Int64, Int64, FileAccess)

Menginisialisasi instans baru kelas UnmanagedMemoryStream dalam buffer aman dengan offset, panjang, dan akses file tertentu.

UnmanagedMemoryStream()

Sumber:
UnmanagedMemoryStream.cs
Sumber:
UnmanagedMemoryStream.cs
Sumber:
UnmanagedMemoryStream.cs

Menginisialisasi instans baru kelas UnmanagedMemoryStream.

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

Pengecualian

Pengguna tidak memiliki izin yang diperlukan.

Berlaku untuk

UnmanagedMemoryStream(Byte*, Int64)

Sumber:
UnmanagedMemoryStream.cs
Sumber:
UnmanagedMemoryStream.cs
Sumber:
UnmanagedMemoryStream.cs

Penting

API ini bukan kompatibel CLS.

Menginisialisasi instans baru kelas UnmanagedMemoryStream menggunakan lokasi dan panjang memori yang ditentukan.

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*

Penunjuk ke lokasi memori yang tidak dikelola.

length
Int64

Panjang memori yang akan digunakan.

Atribut

Pengecualian

Pengguna tidak memiliki izin yang diperlukan.

Nilai pointernull.

Nilai length kurang dari nol.

-atau-

length cukup besar untuk menyebabkan luapan.

Contoh

Contoh kode berikut menunjukkan cara membaca dari dan menulis ke memori yang tidak dikelola menggunakan kelas UnmanagedMemoryStream. Blok memori yang tidak dikelola dialokasikan dan dibatalkan alokasinya menggunakan kelas Marshal.

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

Keterangan

Konstruktor ini membuat instans baru kelas UnmanagedMemoryStream, dan secara default mengatur properti CanWrite ke false dan properti CanRead ke true. Properti Length diatur ke nilai parameter length dan tidak dapat diubah.

Berlaku untuk

UnmanagedMemoryStream(SafeBuffer, Int64, Int64)

Sumber:
UnmanagedMemoryStream.cs
Sumber:
UnmanagedMemoryStream.cs
Sumber:
UnmanagedMemoryStream.cs

Menginisialisasi instans baru kelas UnmanagedMemoryStream dalam buffer aman dengan offset dan panjang yang ditentukan.

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

Buffer untuk berisi aliran memori yang tidak dikelola.

offset
Int64

Posisi byte di buffer untuk memulai aliran memori yang tidak dikelola.

length
Int64

Panjang aliran memori yang tidak dikelola.

Berlaku untuk

UnmanagedMemoryStream(Byte*, Int64, Int64, FileAccess)

Sumber:
UnmanagedMemoryStream.cs
Sumber:
UnmanagedMemoryStream.cs
Sumber:
UnmanagedMemoryStream.cs

Penting

API ini bukan kompatibel CLS.

Menginisialisasi instans baru kelas UnmanagedMemoryStream menggunakan lokasi, panjang memori, jumlah total memori, dan nilai akses file yang ditentukan.

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*

Penunjuk ke lokasi memori yang tidak dikelola.

length
Int64

Panjang memori yang akan digunakan.

capacity
Int64

Jumlah total memori yang ditetapkan ke aliran.

access
FileAccess

Salah satu nilai FileAccess.

Atribut

Pengecualian

Pengguna tidak memiliki izin yang diperlukan.

Nilai pointernull.

Nilai length kurang dari nol.

-atau-

Nilai capacity kurang dari nol.

-atau-

Nilai length lebih besar dari nilai capacity.

Contoh

Contoh kode berikut menunjukkan cara membaca dari dan menulis ke memori yang tidak dikelola menggunakan kelas UnmanagedMemoryStream. Blok memori yang tidak dikelola dialokasikan dan dibatalkan alokasinya menggunakan kelas Marshal.


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

Keterangan

Parameter length menentukan jumlah memori saat ini yang digunakan. Jika membaca atau menambahkan data ke aliran, nilai length harus sama dengan jumlah data yang valid dalam aliran yang akan dibaca atau dipertahankan. Jika menulis ke aliran, nilai ini harus nol.

Parameter capacity menunjukkan jumlah total memori yang tersedia. Nilai ini dapat menjelaskan wilayah yang lebih panjang dari panjang yang ditentukan, atau menunjukkan wilayah yang dapat ditambahkan. Setiap upaya untuk menulis di luar nilai ini akan gagal.

Parameter access mengatur properti CanRead, dan CanWrite. Perhatikan bahwa menentukan Write tidak menjamin bahwa aliran akan dapat ditulis. Parameter akses memungkinkan pelaksana untuk membuat objek yang implementasinya dapat cocok dengan aliran aktual yang diekspos.

Berlaku untuk

UnmanagedMemoryStream(SafeBuffer, Int64, Int64, FileAccess)

Sumber:
UnmanagedMemoryStream.cs
Sumber:
UnmanagedMemoryStream.cs
Sumber:
UnmanagedMemoryStream.cs

Menginisialisasi instans baru kelas UnmanagedMemoryStream dalam buffer aman dengan offset, panjang, dan akses file tertentu.

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

Buffer untuk berisi aliran memori yang tidak dikelola.

offset
Int64

Posisi byte di buffer untuk memulai aliran memori yang tidak dikelola.

length
Int64

Panjang aliran memori yang tidak dikelola.

access
FileAccess

Mode akses file ke aliran memori yang tidak dikelola.

Berlaku untuk