Поделиться через


UnmanagedMemoryStream Конструкторы

Определение

Инициализирует новый экземпляр класса UnmanagedMemoryStream.

Перегрузки

UnmanagedMemoryStream()

Инициализирует новый экземпляр класса UnmanagedMemoryStream.

UnmanagedMemoryStream(Byte*, Int64)

Инициализирует новый экземпляр класса UnmanagedMemoryStream с помощью указанного расположения и длины памяти.

UnmanagedMemoryStream(SafeBuffer, Int64, Int64)

Инициализирует новый экземпляр класса UnmanagedMemoryStream в безопасном буфере с указанным смещением и длиной.

UnmanagedMemoryStream(Byte*, Int64, Int64, FileAccess)

Инициализирует новый экземпляр класса UnmanagedMemoryStream с помощью указанного расположения, длины памяти, общего объема памяти и значений доступа к файлам.

UnmanagedMemoryStream(SafeBuffer, Int64, Int64, FileAccess)

Инициализирует новый экземпляр класса UnmanagedMemoryStream в безопасном буфере с указанным смещением, длиной и доступом к файлам.

UnmanagedMemoryStream()

Исходный код:
UnmanagedMemoryStream.cs
Исходный код:
UnmanagedMemoryStream.cs
Исходный код:
UnmanagedMemoryStream.cs

Инициализирует новый экземпляр класса UnmanagedMemoryStream.

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

Исключения

У пользователя нет необходимых разрешений.

Применяется к

UnmanagedMemoryStream(Byte*, Int64)

Исходный код:
UnmanagedMemoryStream.cs
Исходный код:
UnmanagedMemoryStream.cs
Исходный код:
UnmanagedMemoryStream.cs

Важно!

Этот API несовместим с CLS.

Инициализирует новый экземпляр класса UnmanagedMemoryStream с помощью указанного расположения и длины памяти.

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

Параметры

pointer
Byte*

Указатель на неуправляемое расположение памяти.

length
Int64

Длина используемой памяти.

Атрибуты

Исключения

У пользователя нет необходимых разрешений.

Значение pointer равно null.

Значение length меньше нуля.

-или-

length достаточно велик, чтобы вызвать переполнение.

Примеры

В следующем примере кода показано, как считывать и записывать в неуправляемую память с помощью класса UnmanagedMemoryStream. Блок неуправляемой памяти выделяется и не выделяется с помощью класса 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));
    }
}

Комментарии

Этот конструктор создает новый экземпляр класса UnmanagedMemoryStream, а по умолчанию задает для свойства CanWrite значение false, а свойство CanReadtrue. Свойство Length имеет значение параметра length и не может быть изменено.

Применяется к

UnmanagedMemoryStream(SafeBuffer, Int64, Int64)

Исходный код:
UnmanagedMemoryStream.cs
Исходный код:
UnmanagedMemoryStream.cs
Исходный код:
UnmanagedMemoryStream.cs

Инициализирует новый экземпляр класса UnmanagedMemoryStream в безопасном буфере с указанным смещением и длиной.

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)

Параметры

buffer
SafeBuffer

Буфер, содержащий неуправляемый поток памяти.

offset
Int64

Позиция байтов в буфере, с которой запускается неуправляемый поток памяти.

length
Int64

Длина неуправляемого потока памяти.

Применяется к

UnmanagedMemoryStream(Byte*, Int64, Int64, FileAccess)

Исходный код:
UnmanagedMemoryStream.cs
Исходный код:
UnmanagedMemoryStream.cs
Исходный код:
UnmanagedMemoryStream.cs

Важно!

Этот API несовместим с CLS.

Инициализирует новый экземпляр класса UnmanagedMemoryStream с помощью указанного расположения, длины памяти, общего объема памяти и значений доступа к файлам.

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

Параметры

pointer
Byte*

Указатель на неуправляемое расположение памяти.

length
Int64

Длина используемой памяти.

capacity
Int64

Общий объем памяти, назначенный потоку.

access
FileAccess

Одно из FileAccess значений.

Атрибуты

Исключения

У пользователя нет необходимых разрешений.

Значение pointer равно null.

Значение length меньше нуля.

-или-

Значение capacity меньше нуля.

-или-

Значение length больше значения capacity.

Примеры

В следующем примере кода показано, как считывать и записывать в неуправляемую память с помощью класса UnmanagedMemoryStream. Блок неуправляемой памяти выделяется и не выделяется с помощью класса 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();
    }
}

Комментарии

Параметр length определяет текущий объем используемой памяти. При чтении или добавлении данных в поток значение length должно быть равно количеству допустимых данных в потоке для чтения или сохранения. Если запись в поток, это значение должно быть равно нулю.

Параметр capacity указывает объем доступной общей памяти. Это значение может описать регион, который превышает указанную длину, или указать регион, к которому можно добавить. Любая попытка записи за пределами этого значения завершится ошибкой.

Параметр access задает свойства CanReadи CanWrite. Обратите внимание, что указание Write не гарантирует, что поток будет записываемым. Параметры доступа позволяют реализации создавать объект, реализация которого может соответствовать фактическому потоку, который предоставляется.

Применяется к

UnmanagedMemoryStream(SafeBuffer, Int64, Int64, FileAccess)

Исходный код:
UnmanagedMemoryStream.cs
Исходный код:
UnmanagedMemoryStream.cs
Исходный код:
UnmanagedMemoryStream.cs

Инициализирует новый экземпляр класса UnmanagedMemoryStream в безопасном буфере с указанным смещением, длиной и доступом к файлам.

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)

Параметры

buffer
SafeBuffer

Буфер, содержащий неуправляемый поток памяти.

offset
Int64

Позиция байтов в буфере, с которой запускается неуправляемый поток памяти.

length
Int64

Длина неуправляемого потока памяти.

access
FileAccess

Режим доступа к неуправляемой памяти.

Применяется к