Генерировать классы C# из XML, только если XML изменился

У меня есть событие перед сборкой проекта C#, который запускает xsltproc для преобразования некоторых XML в исходные файлы C#. Сгенерированный источник затем создается обычным способом. Это означает, что проект всегда создается независимо от того, изменился ли XML.

Есть ли способ генерировать классы C#, только если XML изменился? Является ли событие перед сборкой неправильным подходом? Буду ли я лучше с пользовательским инструментом, чтобы превратить XML в C#?

Я использую Visual Studio 2010. XML не содержит сериализованных объектов.

Любая помощь высоко ценится.

1 ответ

Решение

В конце я добавил новую ItemGroup в мой файл csproj со ссылками на каждый файл XML. Я дал каждому элементу имя элемента Preprocess:

<ItemGroup>
  <Preprocess Include="Xml\MySourceXmlFile1" />
  <Preprocess Include="Xml\MySourceXmlFile2.xml" />
</ItemGroup>

Позже в файле проекта я переопределил цель BeforeBuild, чтобы она преобразовывала каждый элемент предварительной обработки в исходный файл C# с тем же именем, что и файл XML:

<Target Name="BeforeBuild"
  Inputs="@(Preprocess)"
  Outputs="@(Preprocess->'$(ProjectDir)%(Filename).cs')">
  <Exec Command="xsltproc -o %22$(ProjectDir)%(Filename).cs%22 %22MyTransform.xsl%22 @(Preprocess)" />
</Target>

Обратите внимание, что аргументы xsltproc должны быть экранированы с%22.

Теперь исходный файл C# создается только в случае изменения XML. Я получил подход из этого сообщения на форуме.

Другие вопросы по тегам