Учитывая, что, похоже, MS не хочет скоро исправлять эту проблему, и мы все еще хотим перейти к VS.NET 2010, мы разработали следующий обходной путь. Это не идеально, но достаточно хорошо для нас.
Большинство наших длительных событий после сборки мы запускаем только при сборке для релиза, а не при обычной разработке программного обеспечения. Поэтому в этих случаях мы запускаем эти события во внешнем командном окне, чтобы мы могли отслеживать ход выполнения.
Мы используем команду unix tee (где-то схваченную в сети), чтобы добавить вывод в окно вывода после завершения скрипта.
В событии после сборки у нас есть:
@@echo off
cd "$(ProjectDir)"
START /WAIT cmd /c PostBuildStub.cmd "$(SolutionDir)" "$(ProjectDir)" "$(TargetDir)" "$(SolutionPath)" "$(ConfigurationName)"
ECHO PostBuild output:
TYPE $(TargetDir)postbuildlog.txt
ECHO Done.
Таким образом, событие postbuild запускает внешнее окно cmd и по окончании выдает файл журнала в окно вывода.
PostBuildStub.cmd выглядит так:
@echo off
echo.
set SolutionDir=%~1
set ProjectDir=%~2
set TargetDir=%~3
set SolutionFile=%~4
set ConfigurationName=%~5
CD /D "%ProjectDir%"
CALL PostBuild.cmd %1 %2 %3 %4 %5 | "%SolutionDir%\bin\tee.exe" "%TargetDir%\postbuildlog.txt"
if errorlevel 1 exit 1
Заглушка postbuild создает файл журнала, вызывая реальные команды postbuild и передавая выходные данные как в окно cmd, так и в файл журнала.
Затем в PostBuild.cmd у нас есть старые добрые команды postbuild, которые выполняют компиляцию ресурсов, погружение в воду, запутывание, подписывание или все, что вам нужно: