LARGEADRESSAWARE在安装后关闭

本文关键字:安装 LARGEADRESSAWARE | 更新日期: 2023-09-27 18:29:29

我使用editbin /LARGEADDRESSAWARE命令更改了我的.NET C#exe,以便它可以寻址内存>2 GB。这很好,我可以运行dumpbin命令来验证它是否已成功修改。

然后我继续创建一个.msi包,其中包括这个exe。当我在Windows7目标计算机上运行这个.msi时,它成功地安装了exe。但现在,如果我在目标机器上安装的同一个exe上运行dumpbin,则表明它不再支持内存>2 GB。

是什么原因造成的?是生成.msi的过程,还是在目标计算机上运行.msi?

LARGEADRESSAWARE在安装后关闭

无论这里出了什么问题,都肯定与您手工操作有关。让构建系统为您执行此操作。项目+属性,生成事件选项卡。将其粘贴到"生成后事件命令行"框中:

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

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

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

最后,你的任务将是这样的:

<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头中设置一位)的经典示例。这(几乎)从来没有一开始看起来那么容易。

我想最后我发现安装程序从不同于我使用editbin后期构建命令更新的路径中选择了我的exe。我在我的exe 的后构建命令中添加了这一行

copy "$(targetpath)"  "$(ProjectDir)'obj'x86'release"

所以整个构建后命令看起来像这个

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

感谢