繁体   English   中英

LARGEADDRESSAWARE在安装后关闭了吗?

[英]LARGEADDRESSAWARE turned off after installation?

我已经使用'editbin / LARGEADDRESSAWARE'命令更改了.NET C#exe,以便它可以处理大于2 GB的内存。 这可以正常工作,我可以运行“ dumpbin”命令来验证它是否已成功修改。 然后,我继续创建一个包含此exe的.msi程序包。 当我在Windows 7目标计算机上运行此.msi时,它将成功安装exe。 但是现在,如果我在目标计算机上安装的同一exe上运行“ dumpbin”,则表明它不再支持大于2 GB的内存。 是什么原因造成的? 是在目标计算机上构建.msi的过程还是运行.msi?

先谢谢您的帮助。

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

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

editbin在msbuild后生成步骤中设置LARGEADDRESSAWARE标志存在多个问题。

  1. EditBin x32不在VS命令提示符之外运行,因为未找到mspdb100.dll。 你为什么要在乎呢? 好吧,如果您运行TFS构建工作流,则不会从VS命令提示符处调用msbuild。 这将导致问题...
  2. 您可以通过使用bin \\ amd64 \\ editbin.exe中的一个来解决此问题,但是您只能在x64构建计算机上构建exe。
  3. 如果在$(TargetPath)处修补最终文件,则它将起作用,但是如果您重建项目并且为任务设置了Inputs和Outputs,则它将不会再次运行。 这是一个问题,因为在重建过程中,来自中间文件夹的exe会再次复制到未打补丁的最终位置。
  4. 这还不是吗。 因为如果您使用了强名,则您需要重新签名exe,以使强名再次有效。 它会在您的dev机器上运行,因为大多数时候dev机器都禁用了强名验证,但是它将无法在客户机器上运行。

最后,您的任务将如下所示:

<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 post build命令进行更新的路径不同的路径中选择了我的exe。 我在我的exe副本“ $(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%

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM