2013-08-29 25 views
1

我已經使用'editbin/LARGEADDRESSAWARE'命令來更改我的.NET C#EXE,以便它可以處理大於2 GB的內存。這工作正常,我可以運行'dumpbin'命令來驗證它已被成功修改。 然後我開始創建一個包含這個exe文件的.msi包。當我在Windows 7目標機器上運行這個.msi時,它成功安裝了exe。但是現在,如果我在目標計算機上安裝的同一個exe上運行「dumpbin」,則表明它不再支持大於2 GB的內存。 這是什麼造成的?是在目標機器上建立.msi或運行.msi的過程?LARGEADDRESSAWARE安裝後關閉了嗎?

在此先感謝您的幫助。

+0

我的水晶球說你做了這個調試版本,但不是發佈版本。 –

+1

任何你不能將它構建爲x64或「any」(但不是any-prefer-32)的原因? –

+0

我在我的發佈版本上運行過命令editbin,並且還在此發行版本exe上運行了dumpbin。我正在爲x86編譯它,因爲我的用戶羣是xp和windows 7. – user2730707

回答

1

我認爲最後我發現安裝程序正在從不同於我使用editbin post build命令更新的路徑中選擇我的exe文件。我在我的exe 副本我生成後命令「$(TARGETPATH)」「$(PROJECTDIR)加入這一行\ OBJ \ 86 \發佈」

所以整個後生成的命令看起來像這樣

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

謝謝

4

無論這裏出了什麼問題,它肯定與你手動做這件事有關。讓構建系統爲你做這個。項目+屬性,生成事件選項卡。粘貼到「生成後事件命令行」框:

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

請看我上面的評論。我正在使用後編譯命令。我使用這個後編譯命令editbin.exe/nologo/largeaddressaware「$(targetpath)」 – user2730707

+0

我認爲安裝程序抓取/obj/Release/myApp.exe而不是/ bin/Release/MYAPP.EXE。 – user2730707

1

有幾個問題與EDITBIN設置LARGEADDRESSAWARE標誌一個MSBuild後生成步驟。

  1. EditBin x32不會在VS命令提示符之外運行,因爲找不到mspdb100.dll。你爲什麼要關心?那麼如果你運行一個TFS構建工作流程,則不會從VS命令提示符調用msbuild。這會導致問題...
  2. 您可以通過使用bin \ amd64 \ editbin.exe中的一個來修復此問題,但您可以只在x64構建機器上構建您的exe。
  3. 如果您將最終文件修補到$(TargetPath),那麼它將起作用,但是如果您重新生成項目並且已經爲您的任務設置了輸入和輸出,那麼它將不會再次運行。 這是一個問題,因爲在重建期間,中間文件夾中的exe被再次複製到未修補的最終位置。
  4. 這還不是它。因爲如果你確實強烈地爲你的exe文件命名,你需要重新簽名才能使強名稱再次有效。它會在你的開發機器上運行,因爲大多數時候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頭中設置一位),這很難得到正確的結果。它(幾乎)從一開始就不像看起來那麼容易。

+0

我發現AfterCompile比AfterBuild更好,因爲它是在所有簽名和清單生成之前發生的。 –