Как заставить Visual Studio 2012 перестроить все зависимые проекты при изменении проекта?
У меня есть два проекта: C ++ DLL и приложение C # WPF. Проект C # имеет команду после сборки, чтобы скопировать DLL в папку Debug.
Когда я изменяю проект C ++, DLL перестраивается, а проект C # — нет, и поэтому DLL не обновляется в папке Debug. Затем мне нужно очистить и перестроить решение, прежде чем я увижу обновленные результаты.
Я хотел бы сказать VSу, что всякий раз, когда я обновляю проект C ++, он должен перестраивать проект C # (или, по крайней мере, запускать команду post-build). Проект C # зависит от проекта C ++, но не от ссылки.
Если установка зависимости проекта внутри вашего решения не помогает просто попытаться включить .dll из проекта C ++ в качестве ссылки в другой проект, то он должен признать, что файл был изменен, и перестроить проект.
Чтобы уточнить ответ Питера, это то, что я сделал.
Щелкните правой кнопкой мыши проект C # в обозревателе решений и выберите «Добавить»> «Существующий элемент».
Перейдите к выходной папке C ++, выберите файл DLL, и вместо того, чтобы открывать его кнопкой «Добавить», нажмите кнопку рядом с ним и выберите «Добавить как ссылку».
Сначала я щелкнул правой кнопкой мыши по ссылке, которая была добавлена в ваш проект C #, и выбрал «Свойства», затем изменил «Копировать в выходной каталог» на «Копировать», если новее. Но потом я понял, что вместо текущей конфигурации будет скопирована версия Debug (поскольку именно там указала ссылка). Поэтому я оставил его на Не копировать, так как моя командная строка автоматически выбирает правильную конфигурацию.
Таким образом, теперь проект C # имеет ссылку на выходные данные проекта C ++, которые будут вызывать перестройку при каждом изменении проекта C ++, даже если ссылка не имеет ничего общего с выходными данными проекта.
Для справки, вот моя командная строка после сборки в проекте C # (foobar — это C ++ DLL).
copy "$(SolutionDir)\$(Configuration)\foobar.dll" "$(TargetDir)"
Вставьте следующий код в каждый зависимый проект:
<ItemGroup>
<None Include="$(MSBuildProjectDirectory)\Properties\Build\_buildforcer">
<Visible>true</Visible>
</None>
</ItemGroup>
<Target Name="ForceNextBuild"AfterTargets="PrepareForRun"Condition=" '$(BuildingInsideVisualStudio)' == 'true' ">
<Touch Files="$(MSBuildProjectDirectory)\Properties\Build\_buildforcer"AlwaysCreate="true"/>
</Target>
Вы можете сделать это с помощью Import
если ты хочешь.
Это заставляет проект всегда строить, а не только когда проект зависит от изменений.
Но, эй, эти зависимые проекты часто являются проектами приложений, которые обычно представляют собой тонкие оболочки над бизнес-библиотеками. Более того, компиляция не является обязательной. Это просто MSBuild
выполнение всех целей только, чтобы узнать, что все в курсе. Так что ваши F5
производительность не будет существенно ухудшена.
Я явно пометил None
элемент как Visible
, поскольку элемент должен быть видимым, чтобы этот механизм работал. В соответствующей заметке вам, возможно, придется перезагрузить свое решение после внесения вышеуказанных изменений.