Генерировать классы 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. Я получил подход из этого сообщения на форуме.