我使用'editbin / LARGEADDRESSAWARE'命令来更改我的.NET C#exe,以便它可以解决内存> 2 GB。这工作正常,我可以运行'dumpbin'命令来验证它已被成功修改。 然后我继续创建一个包含此exe的.msi包。当我在Windows 7目标机器上运行此.msi时,它成功安装了exe。但现在,如果我在目标机器上安装的同一个exe上运行'dumpbin',则表明它不再支持内存> 2 GB。 是什么造成的?是在目标机器上构建.msi或运行.msi的过程吗?
提前感谢您的帮助。
答案 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标志有几个问题。
最后你的任务将如下所示:
<Target Name="AfterBuild" BeforeTargets="CopyFilesToOutputDirectory" Inputs="$(IntermediateOutputPath)$(TargetFileName)" Outputs="$(IntermediateOutputPath)largaddessaware.tmp">
<Exec Command="xxxxxbin\amd64\EditBin.exe /LARGEADDRESSAWARE "$(IntermediateOutputPath)$(TargetFileName)""/>
<Exec Command="sn -Ra "$(IntermediateOutputPath)$(TargetFileName)" "$(AssemblyOriginatorKeyFile)""/>
<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%
谢谢