editbin 在 msbuild 构建后步骤中设置 LARGEADDRESSAWARE 标志存在几个问题。
- EditBin x32 不会在 VS 命令提示符之外运行,因为找不到 mspdb100.dll。你为什么要关心?好吧,如果您运行 TFS 构建工作流,则不会从 VS 命令提示符调用 msbuild。这会导致问题...
- 您可以通过使用bin\amd64\editbin.exe中的那个来修复这个问题,但是您只能在 x64 构建机器上构建您的 exe。
- 如果您在 $(TargetPath) 处修补最终文件,那么它将起作用,但如果您重建项目并且为您的任务设置了输入和输出,那么它将不会再次运行。这是一个问题,因为在重建期间,中间文件夹中的 exe 会再次复制到未修补的最终位置。
- 这仍然不是它。因为如果您确实为您的 exe 命名了强名称,您需要重新签名以使强名称再次有效。它将在您的开发机器上运行,因为大多数时候开发机器都禁用了强名称验证,但它无法在客户机器上运行。
最后,您的任务将如下所示:
<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 标头中设置一位)的经典示例,该任务很难正确完成。它(几乎)从来没有像一开始看起来那么容易。