我有一个使用32位非托管DLL的现有32位ASP.NET应用程序。
如果我在64位操作系统上运行它,它会自动成为LARGEADDRESSAWARE(即可以访问完整的4GB虚拟内存)吗?
如果没有,我该怎么办才能使它成为LARGEADDRESSAWARE?
谷歌搜索出现this question,但它缺少上述问题的答案。
修改
This blog表明ASP.NET 1.1工作进程是LARGEADDRESSAWARE,但对ASP.NET 2.0没有提及:
如果使用/ 3Gb启动系统 在boot.ini中切换(仅支持 企业和数据中心版本 Windows 2000和所有版本的 Windows XP和Windows Server 2003)a 与...链接的进程 / LARGEADDRESSAWARE开关可以“看到” 3GB。 Aspnet_wp.exe是链接的 在版本1.1中的方式,可以采取 优点。
编辑2
This is another blog 表明32位ASP.NET应用程序是LARGEADDRESSAWARE,但未提及ASP.NET版本:
我们找到了那些组件 由ASP.NET框架托管的 利用> 2演出内存 空间
我必须说我对这个主题缺乏权威的公开信息感到惊讶。
答案 0 :(得分:4)
我设法访问运行Windows 2003 SP2的服务器,答案似乎是肯定的,32位ASP.NET应用程序是LARGEADDRESSAWARE,并且可以访问完整的4GB虚拟内存。
我建立了这个:
使用“dumpbin / headers”检查w3wp.exe(32位IIS工作进程)。这表明LARGEADDRESSAWARE位已设置。
运行一个试图分配超过2GB虚拟内存的32位ASP.NET应用程序:这很成功。
我假设Windows 2008 / IIS7的结果相同,但尚未对其进行测试。
答案 1 :(得分:-1)
不,不会。要使其具有较大的地址感知能力,您必须将IIS作为64位应用程序运行(不使用WOW运行)。这意味着您的32位非托管dll必须替换为它们的64位版本。
通常,当选择编译器选项以定位任何平台时,asp.net将转换为64位应用程序(这是默认设置)。你有32位应用程序的问题是有非托管的32位dll。这些不能在64位应用程序中运行。这意味着您必须将ASP.NET应用程序作为32位应用程序运行,这意味着您必须在64位服务器上安装32位版本的IIS。避免这种情况的唯一方法是将32位非托管dll替换为设计为在64位环境中运行的dll。 32位应用程序无法使用64位服务器上的所有内存,因此您的应用程序将无法“看到”额外的内存。
ASP.NET应用程序将在64位环境中重新编译自己(在编译时提供目标任何环境选项),因此它们不再是32位应用程序。