0

我想使用超过 1.2 GB 的 RAM。

所以我尝试了这个editbin /LAGEADRESSAWARE命令。

该命令执行没有错误,但我仍然在 1.2 GB 时出现内存不足异常。

现在我问自己:我的项目中有几个 exe 文件。必须处理哪些 exe 文件:

  1. 所有exe文件
  2. 入口组件 [1]
  3. 执行程序集 [1]

[1]:在 System.Reflection.Assembly.GetEntryAssembly/GetExecutingAssembly 中定义的术语输入/执行)

我尝试了2)和3),但没有效果。

的输出editbin只是:

2>  Microsoft (R) COFF/PE Editor Version 11.00.61030.0
2>  Copyright (C) Microsoft Corporation.  All rights reserved.

这是正确的输出吗?

4

3 回答 3

1

为确保它正常工作,您需要使用与 editbin 位于同一文件夹中的 dumpbin。它显示有关通用对象文件格式 (COFF) 二进制文件的信息。当启用 /largeaddressaware 时,我们可以看到额外的标题“应用程序可以处理大 (>2GB) 地址

               14C machine(x86)
                 3 number of sections
          5AB8D688 time date stamp Mon Mar 26 13:16:24 2018
                 0 file pointer to symbol table
                 0 number of symbols
                E0 size of optional header
               122 characteristics
                     Executable
                     Application can handle large(>2GB) addresses
                     32 bit word machine

如果未启用(默认):

  FILE HEADER VALUES
               14C machine(x86)
                 3 number of sections
          5AB8D734 time date stamp Mon Mar 26 13:19:16 2018
                 0 file pointer to symbol table
                 0 number of symbols
                E0 size of optional header
               102 characteristics
                     Executable
                     32 bit word machine

从命令:

>“C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\dumpbin”/headers C:\MyFile.exe

来自 VS 购买后事件:

调用 "$(DevEnvDir)..\tools\vsvars32.bat"
editbin /largeaddressaware "$(TargetPath)"
dumpbin /headers "$(TargetPath)"

如果会有一些错误,那么直接使用你的环境版本:

调用 "$(VS100COMNTOOLS)..\tools\vsvars32.bat" // 用于 vs 2012。

调用 "$(VS120COMNTOOLS)..\tools\vsvars32.bat" // 用于 vs 2013。

或有条件:

IF  EXIST  "%VS100COMNTOOLS%"  CALL  "%VS100COMNTOOLS%vsvars32.bat" 
IF  EXIST  "%VS110COMNTOOLS%"  CALL  "%VS110COMNTOOLS%vsvars32.bat" 
IF  EXIST  "%VS120COMNTOOLS%"  CALL  "%VS120COMNTOOLS%vsvars32.bat" 
IF  EXIST  "%VS140COMNTOOLS%"  CALL  "%VS140COMNTOOLS%vsvars32.bat" 
IF  EXIST  "%VS150COMNTOOLS%"  CALL  "%VS150COMNTOOLS%vsvars32.bat"  

(更新)VS 2017:

call "%vsappiddir%..\tools\vsdevcmd.bat"
于 2018-03-26T11:24:25.537 回答
0

我重新打开了这个问题。完全回答我的问题

1) 它不适用于 x86。我现在将所有项目更改为使用“任何 cpu”。在设置项目时,我遇到了一些 2.0 第三方库的问题,但这似乎现在可以工作,可能是新的框架版本(4.5)。所以我现在可以切换到“任何 cpu”。

2)看来,只有入口程序集必须用editbin编辑。

3) 项目设置“32 Bit bevorzugen”必须禁用。

4) 必须停用 Visual Studio 主机进程。

5) 实际上,对于大多数项目来说,仅仅进行设置是不够的。我需要打开“32 bit bevorzugen”,重新编译,再次关闭,重新编译,然后它神奇地工作。我使用的 VS 2012 的构建过程中似乎存在一些零星的问题。

于 2018-03-27T11:08:14.487 回答
0

您尝试分配一个单字节数组以确定您可以分配多少内存。单个数组限制为 2^30 个元素。/LARGEADDRESSAWARE 不会改变这一点。

尝试分配一个 100mb 数组的列表。

于 2017-12-20T22:34:49.730 回答