C # — заставить Visual Studio перестраивать зависимые проекты

Как заставить Visual Studio 2012 перестроить все зависимые проекты при изменении проекта?

У меня есть два проекта: C ++ DLL и приложение C # WPF. Проект C # имеет команду после сборки, чтобы скопировать DLL в папку Debug.

Когда я изменяю проект C ++, DLL перестраивается, а проект C # — нет, и поэтому DLL не обновляется в папке Debug. Затем мне нужно очистить и перестроить решение, прежде чем я увижу обновленные результаты.

Я хотел бы сказать VSу, что всякий раз, когда я обновляю проект C ++, он должен перестраивать проект C # (или, по крайней мере, запускать команду post-build). Проект C # зависит от проекта C ++, но не от ссылки.

6

Решение

Если установка зависимости проекта внутри вашего решения не помогает просто попытаться включить .dll из проекта C ++ в качестве ссылки в другой проект, то он должен признать, что файл был изменен, и перестроить проект.

2

Другие решения

Чтобы уточнить ответ Питера, это то, что я сделал.

Щелкните правой кнопкой мыши проект C # в обозревателе решений и выберите «Добавить»> «Существующий элемент».

Перейдите к выходной папке C ++, выберите файл DLL, и вместо того, чтобы открывать его кнопкой «Добавить», нажмите кнопку рядом с ним и выберите «Добавить как ссылку».

Сначала я щелкнул правой кнопкой мыши по ссылке, которая была добавлена ​​в ваш проект C #, и выбрал «Свойства», затем изменил «Копировать в выходной каталог» на «Копировать», если новее. Но потом я понял, что вместо текущей конфигурации будет скопирована версия Debug (поскольку именно там указала ссылка). Поэтому я оставил его на Не копировать, так как моя командная строка автоматически выбирает правильную конфигурацию.

Таким образом, теперь проект C # имеет ссылку на выходные данные проекта C ++, которые будут вызывать перестройку при каждом изменении проекта C ++, даже если ссылка не имеет ничего общего с выходными данными проекта.

Для справки, вот моя командная строка после сборки в проекте C # (foobar — это C ++ DLL).

copy "$(SolutionDir)\$(Configuration)\foobar.dll" "$(TargetDir)"
3

Вставьте следующий код в каждый зависимый проект:

<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, поскольку элемент должен быть видимым, чтобы этот механизм работал. В соответствующей заметке вам, возможно, придется перезагрузить свое решение после внесения вышеуказанных изменений.

0
По вопросам рекламы [email protected]