Запустите собственный инструмент Visual Studio во время сборки

У меня есть script, который преобразует текстовый файл в файл ресурсов, так что я могу иметь поддержку нескольких языков, имея текстовые файлы для разных языков, преобразованных в разные ресурсы. Как только я запустил script, чтобы получить файл resx, я должен запустить специальный инструмент сборки (как описано здесь: Ссылка на проект кода), чтобы создать файлы Designer.cs для использования новых файлов.

В соответствии с философией, что я должен был бы построить весь проект одним нажатием кнопки, как я могу удалить шаг, на котором я должен явно вызвать инструмент пользовательской сборки, чтобы сделать файлы codebehind?

Я попытался автоматически удалить файлы Designer.cs в качестве шага предварительной сборки, так как я подумал бы, что инструмент автоматической сборки будет автоматически запускаться, если не было файлов Designer.cs, но без кубиков.

Итак, я хочу, чтобы моя сборка script в Visual Studio/msbuild выполняла: 1) конвертировать текст в resx (сделано) 2) переместить файлы resx в соответствующий каталог (сделано) 3) создавать файлы designer.cs с помощью специального инструмента сборки (не сделано)

Это последний шаг...

Ответ 1

К сожалению, я не думаю, что это простой способ сделать это. Пользовательские инструменты сборки запускаются только из VS.NET - они не запускаются при создании проекта с использованием MSBuild из командной строки.

В общем случае, если у вас есть выбор для написания инструмента сборки в качестве инструмента создания клиента или задачи MSBuild, то каждый раз выберите задачу MSBuild, поскольку эти задачи будут выполняться в VS.NET и из командной строки.

Файлы designer.cs для ресурсов поддерживаются вашей кодировкой. Они дают вам строго типизированный доступ к файлу ресурсов. Итак, до тех пор, пока вы создаете свои ресурсы для инвариантов культуры в VS.NET(и пусть они создают файлы .designer.cs), добавление дополнительной поддержки языка позже (дополнительные .resx файлы) должно работать нормально.

Если, однако, ваши текстовые файлы являются вашими основными файлами ресурсов, и вы сначала добавляете новые строки ресурсов в эти текстовые файлы, тогда вам нужно найти другой способ генерации файлов .cs, которые позволяют вам кодировать эти ресурсы. Если бы вы сделали это, создание файла .designer.cs самостоятельно (или нечто похожее) не было бы таким сложным. Используя CodeDom или T4, вы можете создать вспомогательный класс, используя существующий файл .designer.cs в качестве шаблона.

Ответ 2

Существует способ генерации *.Designer.cs для *.resx как части процесса сборки. Существует встроенная задача MSBuild GenerateResource, которая в основном представляет собой оболочку инструмента SDK resgen.exe. Здесь вы можете найти пример, как его использовать.

Другая полезная вещь, если сгенерированная версия *.Designer.cs неверна, в основном задача GenerateResource не вызывает нужную версию resgen.exe, устанавливая свойство SdkToolsPath может вам помочь.

Ответ 3

Вы пытались добавить шаг Exec в шаге Before/AfterBuild в своем csproj? Вы должны вручную отредактировать файл для этого, но это должно решить вашу проблему.

Я не совсем понимаю, если вы хотите, чтобы это было сделано до или после сборки. Если вам понадобится это сделать через некоторое время после Pass1/Pass2, вы можете напрямую подключиться к цели. Попробуйте изучить Microsoft.Build.Common.Targets, чтобы понять, как это сделать.