2

ベンダーの c# サンプル コードを PCI-Express デバイスとのインターフェイスに適応させようとしています。このコードは基本的に、大きなバッファーを int 配列として割り当て、fixed キーワードを介してピン留めしてから、ハードウェアに渡してデータを入力します。

これはうまく機能しますが、.Net は配列内の要素が最大 20 億に制限されているため、最終的には失敗します。Long の配列と gcAllowVeryLargeObjects キーワードを使用して制限を 16 GB に押し上げることができますが、最終的にはまだ .Net 制限に遭遇します。

アンマネージ コードでは、VirtualAlloc を呼び出して 40 GB または 50 GB を直接要求できますが、これが c# で可能かどうかは明確ではなく、適切なサンプル コードを見つけることができませんでした。別の言語でこれを行うことができることはわかっていますが、少なくとも Windows では .Net に精通しており、プログラムのこの比較的小さな部分を除けば、ハードウェア固有のコードはほとんどないので、私が持っているものに固執しようとします。

4

2 に答える 2

7

VirtualAlloc を pinvoke できます。サインは

[DllImport("kernel32.dll", SetLastError=true)]
static extern IntPtr VirtualAlloc(IntPtr lpAddress, UIntPtr dwSize, AllocationType lAllocationType, MemoryProtection flProtect);

ほとんどの pinvoke 構造と署名は、pinvoke.net: VirtualAllocで見つけることができます。

または、AllocHGlobal関数を見てください

于 2014-04-09T07:37:17.850 に答える