3

我有一个使用 32 位非托管 DLL 的现有 32 位 ASP.NET 应用程序。

如果我在 64 位操作系统上运行它,它会自动成为 LARGEADDRESSAWARE(即可以访问全部 4GB 虚拟内存)吗?

如果没有,我该怎么做才能使它成为 LARGEADDRESSAWARE?

谷歌搜索出现了这个问题,但它缺乏上述问题的答案。

编辑

此博客建议 ASP.NET 1.1 工作进程是 LARGEADDRESSAWARE,但对 ASP.NET 2.0 保持沉默:

如果使用 boot.ini 中的 /3Gb 开关引导系统(仅支持 Windows 2000 的企业版和数据中心版,以及所有版本的 Windows XP 和 Windows Server 2003),则与 /LARGEADDRESSAWARE 开关链接的进程可以“见“3Gb。Aspnet_wp.exe 在 1.1 版中以这种方式链接,并且可以利用它。

编辑 2

这是另一个博客,建议 32 位 ASP.NET 应用程序是 LARGEADDRESSAWARE,但没有提及 ASP.NET 版本:

我们发现由 ASP.NET 框架托管的组件正在利用 > 2 gig 的内存空间

我必须说,我对缺乏关于这个主题的权威公开信息感到惊讶。

4

2 回答 2

4

我设法访问了运行 Windows 2003 SP2 的服务器,答案似乎是肯定的,32 位 ASP.NET 应用程序是 LARGEADDRESSAWARE,并且可以访问全部 4GB 的虚拟内存。

我通过以下方式建立了这一点:

  • 使用“dumpbin /headers”检查 w3wp.exe(32 位 IIS 工作进程)。这表明设置了 LARGEADDRESSAWARE 位。

  • 运行尝试分配超过 2GB 虚拟内存的 32 位 ASP.NET 应用程序:这是成功的。

我假设 Windows 2008 / IIS7 的结果是相同的,但尚未对其进行测试。

于 2009-11-03T12:49:21.167 回答
-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 位应用程序。

于 2009-11-02T14:59:18.867 回答