Копирование MSBuild из IntermediateOutputPath после завершения сборки
Я использую Afterthought (аналогично PostSharp) для применения изменений после сборки к некоторому коду путем изменения выходной сборки. В настоящее время мой файл проекта имеет что-то вроде этого (сокращенно):
<Target Name="AfterBuild">
<AfterThoughtTask TargetAssembly="$(TargetPath)" AmendWith="$(TargetDir)Amendments.dll" />
</Target>
В основном это говорит: после сборки используйте AfterThoughtTask, который запускает процесс для изменения выходной сборки с помощью кода, найденного в Amendments.dll. Это работает очень хорошо, как я ожидал, и вывод MyProject.dll в MyProject\bin\Debug\MyProject.dll
дополнен дополнительным кодом.
Затем я делаю это небольшое изменение в моем файле проекта:
<PropertyGroup>
<OutputPath>SomeOtherProjectLocation\bin\</OutputPath>
</PropertyGroup>
Так что все, что я сделал, это изменил путь вывода. Сейчас отлаживаю AfterThoughtTask
и достичь точки останова после того, как весь код был выполнен. Когда я остановился на этой точке останова, файл SomeOtherProjectLocation\bin\MyProject.dll
(это файл, который я намеревался изменить, находясь в папке, в которой, как я ожидаю, он находится), похоже, исправлен (имеет размер файла 117 КБ против 103 КБ без изменений). Похоже, что все идет хорошо в этот момент. Затем я освобождаю точку останова, и внезапно размер файла падает до 103 КБ, как-то заменяя оригинальный файл без изменений. Глядя на отчет о диагностической сборке, AfterThoughtTask
самая последняя задача, запущенная без сообщенных копий файлов после нее.
Запуск снова с той же точкой останова, я вижу, что файл, расположенный в IntermediateOutputPath
директория (obj\Debug) по-прежнему составляет 103 КБ (без изменений), поэтому я пытаюсь увидеть, перезаписывает ли этот файл исправленный файл. Когда я нахожусь на точке останова (в конце выполнения задачи, но до того, как управление возвращается обратно в сборку), я переименовываю файл в IntermediateOutputPath
каталог для MyProject.dll_hidden. Я не получаю ошибок, но мой файл больше не перезаписывается.
Так что я могу только предположить, что файл копируется из IntermediateOutputPath
каталог над целевым файлом, но журнал сборки, кажется, не указывает на это, и я не понимаю, почему изменение OutputPath
сделает это таким образом против того, как он действовал раньше с дефолтом OutputPath
, У кого-нибудь есть руководство? Заранее спасибо.
1 ответ
Создайте его с помощью командной строки и установите для verbosity diag (/v:diag). Передайте вывод в лог-файл и откопайте его - обычно с помощью вывода diag вы можете легко найти источник проблемы (или опубликовать журнал здесь).
Также проверьте следующее - если вы измените глобальный OutputPath - другие проекты сборки будут записывать в эту папку - построить с неизмененным OutputPath и найти, какой dll проекта соответствует размеру 117 КБ.