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