11

このコードを使用して、アンマネージ コードの IntPtr バッファーからファイルにバイトを保存しています。これは単純なコールバック関数です:

private void callback(IntPtr buffer, int length)
{
    byte[] bytes = new byte[length];
    Marshal.Copy(buffer, bytes, 0, length);
    FileStream file = new FileStream(filename, FileMode.Create, FileAccess.Write);
    file.Write(bytes, 0, length);
    file.Close();
}

私が欲しいのは、このデータをファイルに保存して捨てることです。私が理解していることから、アンマネージ コードにはバッファーがあり、MY コードには 2 つ目のバッファーがあります。データをコピーしたくないので、直接コピーしたい:

// bad:     (unmanaged) buffer -> (managed) bytes -> file
// awesome: (unmanaged) buffer ->                    file

私の仕事では、データをファイルに保存する最も速い方法が必要です。

4

2 に答える 2

15

カーネル dll への呼び出しを使用するよりも、おそらく .NET フレームワーク内にとどまる方がよいでしょう。

私は使うだろう:

private void callback(IntPtr buffer, int length, String filename)
{
    try
    {
        FileStream file = new FileStream(filename, FileMode.Create, FileAccess.Write);
        UnmanagedMemoryStream ustream = new UnmanagedMemoryStream((byte*)buffer, length);
        ustream.CopyTo(file);
        ustream.Close();
        file.Close();
    }
    catch{/** To do: catch code **/}
}
于 2014-05-08T05:38:00.103 に答える
5

まあ、それは何らかの理由で「管理」と呼ばれています:-)しかし、あなたができることは、次のように、P/Invokeを使用してWriteFileを宣言することです。

private void callback(IntPtr buffer, int length)
{
    FileStream file = new FileStream(filename, FileMode.Create, FileAccess.Write);
    int written;
    WriteFile(file.Handle, buffer, length, out written, IntPtr.Zero);
    file.Close();
}

 [DllImport("kernel32.dll")]
 private static extern bool WriteFile(IntPtr hFile, IntPtr lpBuffer, int NumberOfBytesToWrite, out int lpNumberOfBytesWritten, IntPtr lpOverlapped);
于 2012-12-03T11:40:38.277 に答える