导出 (0) 打印
全部展开
此文章由人工翻译。 将光标移到文章的句子上,以查看原文。
译文
原文

UnmanagedMemoryStream 类

提供从托管代码访问非托管内存块的能力。

命名空间:  System.IO
程序集:  mscorlib(在 mscorlib.dll 中)

public class UnmanagedMemoryStream : Stream

UnmanagedMemoryStream 类型公开以下成员。

  名称说明
受保护的方法UnmanagedMemoryStream()初始化 UnmanagedMemoryStream 类的新实例。
公共方法UnmanagedMemoryStream(Byte*, Int64)用指定的位置和内存长度初始化 UnmanagedMemoryStream 类的新实例。
公共方法UnmanagedMemoryStream(SafeBuffer, Int64, Int64)在具有指定的偏移量和长度的安全缓冲区中初始化 UnmanagedMemoryStream 类的新实例。
公共方法UnmanagedMemoryStream(Byte*, Int64, Int64, FileAccess)使用指定的位置、内存长度、内存总量和文件访问值初始化 UnmanagedMemoryStream 类的新实例。
公共方法UnmanagedMemoryStream(SafeBuffer, Int64, Int64, FileAccess)在具有指定的偏移量、长度和文件访问的安全缓冲区中初始化 UnmanagedMemoryStream 类的新实例。
页首

  名称说明
公共属性CanRead获取一个值,该值指示流是否支持读取。 (重写 Stream.CanRead。)
公共属性CanSeek获取一个值,该值指示流是否支持查找。 (重写 Stream.CanSeek。)
公共属性CanTimeout获取一个值,该值确定当前流是否可以超时。 (继承自 Stream。)
公共属性CanWrite获取一个值,该值指示流是否支持写入。 (重写 Stream.CanWrite。)
公共属性Capacity获取流的长度(大小)或分配给流的内存总量(容量)。
公共属性Length获取流的数据长度。 (重写 Stream.Length。)
公共属性Position获取或设置流中的当前位置。 (重写 Stream.Position。)
公共属性PositionPointer获取或设置基于流中当前位置的指向流的字节指针。
公共属性ReadTimeout获取或设置一个值(以毫秒为单位),该值确定流在超时前尝试读取多长时间。 (继承自 Stream。)
公共属性WriteTimeout获取或设置一个值(以毫秒为单位),该值确定流在超时前尝试写入多长时间。 (继承自 Stream。)
页首

  名称说明
公共方法BeginRead开始异步读操作。 (继承自 Stream。)
公共方法BeginWrite开始异步写操作。 (继承自 Stream。)
公共方法Close关闭当前流并释放与之关联的所有资源(如套接字和文件句柄)。 (继承自 Stream。)
公共方法CopyTo(Stream)从当前流中读取字节并将其写入到目标流中。 (继承自 Stream。)
公共方法CopyTo(Stream, Int32)从当前流中读取所有字节并将其写入到目标流中(使用指定的缓冲区大小)。 (继承自 Stream。)
公共方法CreateObjRef创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。 (继承自 MarshalByRefObject。)
受保护的方法CreateWaitHandle 已过时。分配 WaitHandle 对象。 (继承自 Stream。)
公共方法Dispose()释放由 Stream 占用的所有资源。 (继承自 Stream。)
受保护的方法Dispose(Boolean)释放由 UnmanagedMemoryStream 占用的非托管资源,还可以另外再释放托管资源。 (重写 Stream.Dispose(Boolean)。)
公共方法EndRead等待挂起的异步读取完成。 (继承自 Stream。)
公共方法EndWrite结束异步写操作。 (继承自 Stream。)
公共方法Equals(Object)确定指定的 Object 是否等于当前的 Object (继承自 Object。)
受保护的方法Finalize允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。 (继承自 Object。)
公共方法Flush重写 Flush 方法以便不执行任何操作。 (重写 Stream.Flush()。)
公共方法GetHashCode用作特定类型的哈希函数。 (继承自 Object。)
公共方法GetLifetimeService检索控制此实例的生存期策略的当前生存期服务对象。 (继承自 MarshalByRefObject。)
公共方法GetType获取当前实例的 Type (继承自 Object。)
受保护的方法Initialize(Byte*, Int64, Int64, FileAccess)使用指向非托管内存位置的指针初始化 UnmanagedMemoryStream 类的新实例。
受保护的方法Initialize(SafeBuffer, Int64, Int64, FileAccess)在具有指定的偏移量、长度和文件访问的安全缓冲区中初始化 UnmanagedMemoryStream 类的新实例。
公共方法InitializeLifetimeService获取控制此实例的生存期策略的生存期服务对象。 (继承自 MarshalByRefObject。)
受保护的方法MemberwiseClone()创建当前 Object 的浅表副本。 (继承自 Object。)
受保护的方法MemberwiseClone(Boolean)创建当前 MarshalByRefObject 对象的浅表副本。 (继承自 MarshalByRefObject。)
受保护的方法ObjectInvariant基础结构。提供对 Contract 的支持。 (继承自 Stream。)
公共方法Read将指定数目的字节读入指定的数组。 (重写 Stream.Read(Byte[], Int32, Int32)。)
公共方法ReadByte从流中读取一个字节,并将流内的位置向前推进一个字节,如果已到达流的末尾,则返回 -1。 (重写 Stream.ReadByte()。)
公共方法Seek将当前流的当前位置设置为给定值。 (重写 Stream.Seek(Int64, SeekOrigin)。)
公共方法SetLength将流的长度设置为指定的值。 (重写 Stream.SetLength(Int64)。)
公共方法ToString返回表示当前对象的字符串。 (继承自 Object。)
公共方法Write使用缓冲区中的数据将字节块写入当前流。 (重写 Stream.Write(Byte[], Int32, Int32)。)
公共方法WriteByte将一个字节写入文件流的当前位置。 (重写 Stream.WriteByte(Byte)。)
页首

此类支持使用现有的基于流的模型访问非托管内存,并且不要求将非托管内存中的内容复制到堆。

下面的代码示例演示如何使用 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();
    }
}


.NET Framework

受以下版本支持:4、3.5、3.0、2.0

.NET Framework Client Profile

受以下版本支持:4、3.5 SP1

Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2

.NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求

此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。

社区附加资源

添加
Microsoft 正在进行一项网上调查,以了解您对 MSDN 网站的意见。 如果您选择参加,我们将会在您离开 MSDN 网站时向您显示该网上调查。

是否要参加?
显示:
© 2014 Microsoft