好的 - 问题的核心似乎是 Visual Studio C++ 和 C# 构建引擎完全不同。
C++ 构建引擎执行项目的构建前或构建后事件“命令行”中指定的批处理代码而不将实际代码转储到输出窗口;它只是转储代码echoed 的内容,以及代码执行的命令发出的内容(例如copy 命令的“复制的2 个文件”等)。在网上看到的大概是针对 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
这样可以更简洁地控制输出,只有在这个批处理脚本中echoed 的东西才会输出到输出窗口。
最后,如上所述,当构建后处理失败时(即批处理代码以@以外的代码退出),C# 和 C++ 构建引擎也会在“错误列表”中出现的错误消息中输出不同的内容987654328@)。 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.
对于单个错误消息仍然有点拗口,但比将我们移动到批处理文件中的所有代码都包含在错误消息中更易于管理!
即便如此,如果能够自定义出现在错误列表中的此错误消息以显示我定义的内容,那就太好了。我怀疑这是否可能,但如果有人知道这样做的方法,请不要犹豫,将其作为评论发布!