32 ビット ライブラリとリンクする必要があり、可能な限り最大量のメモリを使用する必要がある C# アプリがあります (イメージング アプリ)。XP64 デスクトップでアプリを実行するため、WOW64 を使用し、Visual Studio for x86 でビルドをターゲットにしています (そしてeditbin /largeaddressaware
ポストビルドを実行しています)。いくつかの問題が発生しています:
Visual Studio のビルトイン デバッガーでは、2 GB のメモリしか使用できません (アプリに最大 1.5 GB とオーバーヘッドを加えたもの)。
コマンド ラインから実行すると、アプリは 3 GB のメモリを認識できますが、Microsoft のドキュメントでは 4 GB を表示する必要があると記載されているようです。
WOW64 C# アプリを取得して、プラットフォームが提供できる完全な 4 GB を表示する方法を誰か教えてもらえますか?
また、Visual Studio (VS 2008、別名 VS90) デバッガーが/largeaddressaware
ビットに従い、アプリのメモリを 2 GB に制限するのをやめる方法を教えてもらえますか?
VS80 と VS90 でも同じ動作が見られます。また、.NET Framework 3.5、3.0、2.0 の間でも違いはありません。問題を説明する簡単な C# プログラムを次に示します。x86 用にビルドしeditbin /largeaddressaware
、組み込みデバッガーで実行する場合とコマンド ラインから実行する場合を比較して、C# で使用できるメモリの違いを確認します。
namespace MemoryAllocTest
{
class Program
{
static void Main(string[] args)
{
const int allocSize = 1024 * 1024;
List<byte[]> myMem = new List<byte[]>();
UInt64 totalAlloc = 0;
while (true)
{
myMem.Add(new byte[allocSize]);
totalAlloc += allocSize;
Console.WriteLine("{0} allocs: {1}MB total",
myMem.Count, totalAlloc / (1024 * 1024));
}
}
}
}