2

更新された質問

ctor は .NETCF (パブリック FileStream(IntPtr ハ​​ンドル、FileAccess アクセス) ではサポートされていないため、限られたリソース (RAM) プラットフォームでマネージ コードとアンマネージ コードの間でメモリ内の大きなファイルを共有する他の方法を提案してください。プロセス空間/ヒープ外の 2GB ユーザー空間 (Win CE 5.0) の上部領域にファイルをマップする. C# でそれを行うにはどうすればよいですか?

また、MemoryStream オブジェクトは Win CE 5.0 のヒープまたはメモリ マップ領域にスペースを割り当てますか?

ありがとう...

元の質問

以下のように、ネイティブの 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) SafeFileHandle / Handle プロパティが .NETCF バージョンでサポートされていないことを考えると、この方法で何か問題はありますか? それを行うより良い方法はありますか (FileStream / MemoryStream でネイティブ メモリ マップ ファイル ハンドルを使用する予定です)。

2) FileStream オブジェクトによって割り当てられたメモリは .NETCF ガベージ コレクタに該当しますか? または、ハンドルがネイティブ API を使用して作成されたメモリ マップされたファイルのものである場合、それ (マネージド FileStream オブジェクトとそのリソース) はガベージ コレクターの範囲外ですか?*

前もって感謝します。

4

2 に答える 2

3

全体として、ネイティブの Create ファイルを使用し、それを FileStream オブジェクトにラップするというこのアプローチには何の問題もありません。これは、FileStream でサポートされている機能です。

n ガベージ コレクションの用語ですが、ここでは実際に 2 つのことが関係しています。

  1. FileStream オブジェクトに関連付けられたメモリ。はい、これはガベージコレクションされます
  2. CreateFile で作成されたリソースであるハンドル。FileStream オブジェクトはこのハンドルの所有権を取得し、(受動的または能動的に) 破棄されると解放します。
于 2009-06-28T16:31:04.460 に答える
1

ドキュメントによると、使用する予定のコンストラクターは .NET CF では使用できません。

于 2009-06-28T16:33:53.900 に答える