安装后关闭LARGEADDRESSAWARE?

时间:2013-08-29 20:20:15

标签: c# memory-management exe

我使用'editbin / LARGEADDRESSAWARE'命令来更改我的.NET C#exe,以便它可以解决内存> 2 GB。这工作正常,我可以运行'dumpbin'命令来验证它已被成功修改。 然后我继续创建一个包含此exe的.msi包。当我在Windows 7目标机器上运行此.msi时,它成功安装了exe。但现在,如果我在目标机器上安装的同一个exe上运行'dumpbin',则表明它不再支持内存> 2 GB。 是什么造成的?是在目标机器上构建.msi或运行.msi的过程吗?

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

无论这里出了什么问题,这肯定与你手工完成有关。让构建系统为您完成此操作。 Project + Properties,Build Events选项卡。将其粘贴到“Post-build event命令行”框中:

set pathsave=%path%
set path=$(devenvdir);$(devenvdir)..\..\vc\bin
editbin.exe /nologo /largeaddressaware "$(targetfilename)"
set path=%pathsave%

答案 1 :(得分:1)

editbin在msbuild post构建步骤中设置LARGEADDRESSAWARE标志有几个问题。

  1. EditBin x32不会在VS命令提示符之外运行,因为找不到mspdb100.dll。你为什么要关心?好吧,如果您运行TFS构建工作流,则不会从VS命令提示符调用msbuild。这会导致问题......
  2. 您可以使用 bin \ amd64 \ editbin.exe 中的那个来修复此问题,但之后您只能在x64构建计算机上构建您的exe。
  3. 如果您在$(TargetPath)上修补最终文件,那么它将起作用,但如果您重建项目并且已为任务设置了输入和输出,那么它将不会再次运行。  这是一个问题,因为在重建期间,中间文件夹的exe会再次复制到未修补的最终位置。
  4. 这仍然不是。因为如果你强力命名你的exe,你需要重新签名,以使强名称再次有效。它将在您的开发机器上运行,因为大多数时间开发机器已禁用强名称验证,但它将无法在客户机器上运行。
  5. 最后你的任务将如下所示:

    <Target Name="AfterBuild" BeforeTargets="CopyFilesToOutputDirectory" Inputs="$(IntermediateOutputPath)$(TargetFileName)" Outputs="$(IntermediateOutputPath)largaddessaware.tmp">
       <Exec Command="xxxxxbin\amd64\EditBin.exe /LARGEADDRESSAWARE &quot;$(IntermediateOutputPath)$(TargetFileName)&quot;"/>
       <Exec Command="sn -Ra &quot;$(IntermediateOutputPath)$(TargetFileName)&quot; &quot;$(AssemblyOriginatorKeyFile)&quot;"/>
       <Touch AlwaysCreate="true" Files="$(IntermediateOutputPath)largaddessaware.tmp"/>
    </Target>
    

    我们需要在CopyFiletoOutputDirectory运行之前修补可执行文件,否则我们将在未修补文件已复制到ouptut文件夹后修补中间文件。无法修补最终文件,因为当exe未更改以防止破坏增量构建时,此目标将不会运行。

    这是一个简单任务(在PE头中设置一位)的典型示例,这很难做到。它(几乎)从未像开始时那样容易。

答案 2 :(得分:1)

我认为最后我发现安装程序从不同的路径中选择我的exe,而不是使用editbin post build命令更新的路径。我在我的exe的post build命令中添加了这一行     复制“$(targetpath)”“$(ProjectDir)\ obj \ x86 \ release”

所以整个post build命令看起来像这样

set pathsave=%path%
set path=$(devenvdir);$(devenvdir)..\..\vc\bin
editbin.exe /nologo /largeaddressaware "$(targetpath)"
copy "$(targetpath)"  "$(ProjectDir)\obj\x86\release"
set path=%pathsave%

谢谢