有幾個問題與EDITBIN設置LARGEADDRESSAWARE標誌一個MSBuild後生成步驟。
- EditBin x32不會在VS命令提示符之外運行,因爲找不到mspdb100.dll。你爲什麼要關心?那麼如果你運行一個TFS構建工作流程,則不會從VS命令提示符調用msbuild。這會導致問題...
- 您可以通過使用bin \ amd64 \ editbin.exe中的一個來修復此問題,但您可以只在x64構建機器上構建您的exe。
- 如果您將最終文件修補到$(TargetPath),那麼它將起作用,但是如果您重新生成項目並且已經爲您的任務設置了輸入和輸出,那麼它將不會再次運行。 這是一個問題,因爲在重建期間,中間文件夾中的exe被再次複製到未修補的最終位置。
- 這還不是它。因爲如果你確實強烈地爲你的exe文件命名,你需要重新簽名才能使強名稱再次有效。它會在你的開發機器上運行,因爲大多數時候dev機器已經禁用了強名稱驗證,但它無法在客戶機器上運行。
最後你的任務將是這樣的:
<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頭中設置一位),這很難得到正確的結果。它(幾乎)從一開始就不像看起來那麼容易。
我的水晶球說你做了這個調試版本,但不是發佈版本。 –
任何你不能將它構建爲x64或「any」(但不是any-prefer-32)的原因? –
我在我的發佈版本上運行過命令editbin,並且還在此發行版本exe上運行了dumpbin。我正在爲x86編譯它,因爲我的用戶羣是xp和windows 7. – user2730707