2

更新的问题

由于.NETCF(公共FileStream(IntPtr句柄,FileAccess访问)不支持ctor。您能否建议在有限资源(RAM)平台上的托管和非托管代码之间共享内存中的大文件的其他方法。基本上我想将文件映射到进程空间/堆之外的 2GB 用户空间 (Win CE 5.0) 的上部区域。我该如何在 C# 中做到这一点。

此外,在 Win CE 5.0 上,MemoryStream 对象是否在堆或内存映射区域中分配空间?

谢谢...

原始问题

我正在使用本机 CreateFile() 返回的文件句柄实例化 FileStream 对象(.NETCF,C#),如下所示:

    //P/Invoke    
    [DllImport("coredll.dll", SetLastError = true)]
    public static extern IntPtr CreateFile(string lpFileName,
                                            uint dwDesiredAccess,
                                            uint dwShareMode,
                                            IntPtr lpSecurityAttributes,
                                            uint dwCreationDisposition,
                                            uint dwFlagsAndAttributes,
                                            IntPtr hTemplateFile);
// File handle received from native Win32 API
IntPtr ptr= CreateFile("myfile.txt",
                         0,
                         0,
                         0,
                         FileMode.Create,
                         0, 
                         IntPtr.Zero);

//Instantiate a FileStream object using handle (returned above) as parameter.
FileStream fs = new FileStream(ptr,FileAccess.ReadWrite);

文件将增长到大于 500 KB 或更大的大小。所以,我的问题是:

*1) 鉴于 .NETCF 版本不支持 SafeFileHandle / Handle 属性,这种处理方式有什么问题吗?有没有更好的方法(我打算将本机内存映射文件句柄与 FileStream / MemoryStream 一起使用)?

2) FileStream 对象分配的内存是否属于 .NETCF 垃圾收集器?或者假设该句柄是使用本机 API 创建的内存映射文件,它(托管 FileStream 对象及其资源)不在垃圾收集器的权限范围内?*

提前致谢。

4

2 回答 2

3

总的来说,这种使用本机 Create 文件并将其包装在 FileStream 对象中的方法没有任何问题。这是 FileStream 支持的功能。

尽管这里确实有两件事在起作用,但是关于垃圾收集的 n 条款。

  1. 与 FileStream 对象关联的内存。是的,这将被垃圾收集
  2. 使用 CreateFile 创建的资源句柄。FileStream 对象将获得此句柄的所有权,并在释放它时(被动或主动)释放它。
于 2009-06-28T16:31:04.460 回答
1

根据文档,您计划使用的构造函数在 .NET CF 中不可用。

于 2009-06-28T16:33:53.900 回答