OK - 問題的核心似乎是在Visual Studio C++和C#編譯引擎有很大的不同。
C++構建引擎執行項目的生成前或生成後事件'命令行'中指定的批處理代碼,但不將轉儲到輸出窗口;它只是拋出代碼編輯的echo
,以及代碼執行的命令發出的內容(例如copy
命令的'2個文件被複制'等)。我已經看到了圍繞web大概是用於Visual Studio的C++構建引擎,因爲如果要將C#預生成或後生成的批處理代碼放入C#項目的「事件命令行」框中,則無需真正使用C#構建引擎來回顯任何內容。
這是因爲C#編譯引擎,我用它,不傾倒在框中輸出窗口中的所有代碼。而且,如果代碼失敗,它將在錯誤消息中包含該框中的整個代碼塊,該代碼塊將出現在「錯誤列表」中 - C++構建引擎不會(稍後會詳細介紹)。
我已經找到了最好的解決方案,因此,爲最大限度地減少代碼,你放在一個C#項目的前或生成後事件命令行箱量。您放入的所有內容都將在執行時轉儲到輸出窗口。最小化代碼的最好方法是使其只執行批處理文件,並將必要的參數傳遞給批處理文件。該批處理文件中的內容將不被轉儲到輸出窗口中,但是(如與在「命令行」爲C++構建引擎的代碼)echo
輸出和輸出從命令批處理文件代碼執行將是;這是控制C#前置或後置編譯腳本輸出的好方法。然後,C++構建引擎以與C#引擎在批處理文件中處理代碼相同的方式處理'命令行'框中指定的代碼;它不會轉儲代碼本身,只是代碼的輸出。
所以基本上,如果你正在編譯在Visual Studio C++項目,你可以把所有的批處理腳本在「命令行」框,將無法完全轉儲到輸出窗口。但是,如果編譯C#項目,我建議將您的批處理腳本放在單獨的.bat
文件中,並且只需使用生成前或生成後事件命令行框中的適當參數調用該文件即可。我結束了我的C#生成後事件命令行框中看起來像這樣:
..\..\BuildScripts\PostBuild.bat $(ConfigurationName) $(ProjectName) "$(TargetDir)" "$(ProjectDir)"
...我PostBuild.bat文件看起來像這樣:
@REM Store args...
set _configName=%1%
set _projectName=%2%
@REM Remove quotes from remaining args...
set _targetDir=###%3%###
set _targetDir=%_targetDir:"###=%
set _targetDir=%_targetDir:###"=%
set _targetDir=%_targetDir:###=%
set _projectDir=###%4%###
set _projectDir=%_projectDir:"###=%
set _projectDir=%_projectDir:###"=%
set _projectDir=%_projectDir:###=%
if %_configName% == Release goto StartProcessing
echo No post-build processing required.
exit 0
@REM Start post-build processing
:StartProcessing
echo Starting post-build processing.
@REM use input args to do batch script work, such as:
copy "%_targetDir%*.dll" "%_projectDir%..\..\..\..\..\CommonAssemblies"
if errorlevel 1 goto CopyFailure
@REM etc.
goto PostBuildSuccess
@REM Failure labels
:CopyFailure
echo Post-build processing for %_projectName% FAILED: Failed to copy file(s) to common assemblies directory!
exit 1
@REM Post-build success
:PostBuildSuccess
echo Post-build processing for %_projectName% completed OK.
exit 0
該控制輸出更整齊地,只有在這個批處理腳本中的東西echo
將被輸出到輸出窗口。
最後,如上所述,當構建後處理失敗時,C#和C++構建引擎也會在出現在「錯誤列表」中的錯誤消息中輸出不同的內容(即批處理代碼以非代碼0
)。 ++構建引擎的C似乎總是隻說:
Error result 1 returned from 'C:\Windows\system32\cmd.exe'.
C#的編譯引擎,但是,將包括前或生成後事件命令行框中錯誤消息(取失敗)的全部內容,例如:
The command "..\..\BuildScripts\PostBuild.bat Release MyProject "C:\Development\MyProject\bin\" "C:\Development\MyProject\"" exited with code 1.
還是有點拗口的單個錯誤消息,但不是讓所有我們搬進批處理文件的代碼更易於管理包括在錯誤消息!
即使如此,這將是很好能夠定製出現在錯誤列表中顯示的東西我定義這個錯誤信息。我懷疑這是可能的,但如果有人知道這樣做的方式,請不要猶豫,以發表評論!
來源
2011-06-08 09:33:41
Jez
@stijn好奇,我沒有看到'執行預生成事件...'在我的輸出。你使用的是什麼版本的Visual Studio?另外,您可以粘貼「預生成事件命令行」窗口內容的全部內容嗎? – Jez 2011-06-07 16:07:18
更新了答案。你能準確地發佈你在命令行中使用的東西嗎?我試了幾件事情,但我無法得到它顯示整個命令行 – stijn 2011-06-07 19:41:23
@stijn唉唉......你是一個C++編譯和我建立一個C#項目,這可以解釋爲什麼我沒有看到'執行預生成事件輸出。我確實看到第二個。我會嘗試運行一個.bat文件,看看會發生什麼。我不太明白'我無法顯示整個命令行'。你的命令行是'd:\ test.bat';它在你的輸出中顯示整個命令行,是不是(對於C#構建)? – Jez 2011-06-07 20:29:26