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


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 класса и по умолчанию задает свойству falseCanWrite значение , а свойству CanRead — значение true. Свойство 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

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

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