У меня есть приложение С#, которое должно связываться с 32-битной библиотекой, а также использовать максимальный возможный объем памяти (приложение для обработки изображений); мы запускаем приложение на настольных компьютерах XP64, поэтому мы используем WOW64, настраиваем таргетинг в Visual Studio для x86 (и делаем пост-сборку editbin /largeaddressaware
). Мы сталкиваемся с несколькими проблемами:
-
В встроенном отладчике Visual Studio мы можем использовать только 2 ГБ памяти (~ 1,5 гб для приложения, плюс накладные расходы)
-
Запуск из командной строки, приложение может видеть 3 ГБ памяти, но документы Microsoft, похоже, говорят, что мы должны увидеть 4gb.
Может ли кто-нибудь сказать мне, как получить приложение WOW64 С#, чтобы увидеть полный 4gb, который платформа должна уметь его отдать?
Кроме того, может ли кто-нибудь сказать мне, как заставить отладчик Visual Studio (VS 2008, иначе известный как VS90) подчиняться бит /largeaddressaware
и прекратить ограничение памяти приложения на 2gb?
Я вижу то же поведение в VS80 и VS90; также нет разницы между .NET Framework 3.5, 3.0 и 2.0. Здесь тривиальная программа на С#, которая иллюстрирует проблемы; построить для x86, editbin /largeaddressaware
, а затем запустить во встроенном отладчике или запустить из командной строки, чтобы увидеть разницу в памяти, доступную для С#.
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));
}
}
}
}