Ответ 1
Я только что ответил, что похоже на аналогичный вопрос.
Как отключить кеширование определений построения в Visual Studio
Надеюсь, что это тоже относится к вашей проблеме.
У меня есть проект в моем решении, который начал работать как проект библиотеки С#. Он не интересовался им с точки зрения кода, он просто используется как зависимость в других проектах в моем решении, чтобы обеспечить его создание в первую очередь. Одним из побочных эффектов построения этого проекта является создание общей сборки AssemblyInfo.cs, которая содержит номер версии, используемой другими проектами.
Я сделал это, добавив следующее в файл .csproj:
<ItemGroup>
<None Include="Properties\AssemblyInfo.Shared.cs.in" />
<Compile Include="Properties\AssemblyInfo.Shared.cs" />
<None Include="VersionInfo.targets" />
</ItemGroup>
<Import Project="$(ProjectDir)VersionInfo.targets" />
<Target Name="BeforeBuild" DependsOnTargets="UpdateSharedAssemblyInfo" />
Указанный файл, VersionInfo.targets, содержит следующее:
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<!--
Some properties defining tool locations and the name of the
AssemblyInfo.Shared.cs.in file etc.
-->
</PropertyGroup>
<Target Name="UpdateSharedAssemblyInfo">
<!--
Uses the Exec task to run one of the tools to generate
AssemblyInfo.Shared.cs based on the location of AssemblyInfo.Shared.cs.in
and some of the other properties.
-->
</Target>
</Project>
Содержимое файла VersionInfo.targets может быть просто встроено в файл .csproj, но оно является внешним, потому что я пытаюсь превратить все это в шаблон проекта. Я хочу, чтобы пользователи шаблона могли добавить новый проект в решение, отредактировать файл VersionInfo.targets и запустить сборку.
Проблема заключается в том, что изменение и сохранение файла VersionInfo.targets и перестройка решения не имеют никакого эффекта - файл проекта использует значения из файла .targets так, как они были, когда проект был открыт. Даже выгрузка и перезагрузка проекта не влияет. Чтобы получить новые значения, мне нужно закрыть Visual Studio и снова открыть его (или перезагрузить решение).
Как я могу установить это, чтобы конфигурация была внешней по отношению к файлу .csproj, а не кэширована между сборками?
Я только что ответил, что похоже на аналогичный вопрос.
Как отключить кеширование определений построения в Visual Studio
Надеюсь, что это тоже относится к вашей проблеме.
Насколько я знаю, вы не можете. Visual Studio не использует "настоящий" MSBuild, он использует механизм внутренней сборки, который очень похож на MSBuild.exe, но все же имеет некоторые тонкие отличия. Этот механизм сборки кэширует цели, поэтому вам нужно перезапустить VS, как только вы что-то измените. Я верю, что он даже где-то задокументирован, и неизвестного обходного пути (я искал его около года назад и ничего не нашел).
Вы могли бы заставить VS перезагрузить цели с помощью VS API - так что вам нужно будет создать (или найти) настраиваемое дополнение для этого.
Другим вариантом является использование чего-то другого, кроме файла .targets, для сохранения вашей конфигурации. Например, вы можете использовать простой текстовый файл и анализировать его с помощью MSBuild (не так элегантно, но он должен работать).
Upd.
То, что я сделал некоторое время назад. MSBuild вызывает внешний инструмент через Exec с WorkDirectory = "$ (SolutionDir)", инструмент "знает" все соглашения о именах файлов, местоположениях и т.д., Поэтому рабочего каталога достаточно, чтобы выполнить эту работу. Различные конфигурационные данные сохраняются во внешней конфигурации инструмента, поэтому никаких проблем с кешированием нет.
Кроме того, посмотрите этот вопрос о чтении элементов из файла. Я полагаю, это лучше соответствует вашим потребностям.
У меня был некоторый прерывистый успех, изменяя файл проекта, включая пользовательский файл msbuild, и делая его недействительным, затем перезагружая проект, позволяя ему оставаться выгруженным, а затем фиксируя файл проекта и перезагружая.
Иногда это работает, иногда это не так, но лучше, чем перезапуск Visual Studio.
Если вам нужен быстрый и грязный способ его исправить, вы можете просто перезагрузить решение (через fooobar.com/info/392438/...).
Вы можете сделать это, закрыв открытие файла решения или нажав "Сохранить" во внешнем редакторе (тогда, когда вы вернетесь к VS, вы спросите, хотите ли вы перезагрузить).