Я часто использую Xsd2Code таким образом, но мой подход заключается в добавлении события предварительной сборки, которое вызывает командную строку Xsd2Code и восстанавливает xml в каждой сборке.
Мое событие перед сборкой выглядит так:
$(ProjectDir)BuildTools\Xsd2Code.exe $(ProjectDir)Api\Schemas\MySchema.xsd MyProject.Api.Schemas $(ProjectDir)Api\Schemas\MySchema.cs /platform Net40 /collection Array /sc+ /ap+ /if- /xa+
В вашем случае вы могли бы выполнить этот шаг предварительной сборки только на главном xsd (который я предполагаю, xsd: импортирует другие схемы), или вы можете запустить команду для каждого из ваших файлов схемы отдельно.
Преимущество этого состоит в том, что, если я изменяю схему XSD, я получаю очень полезные ошибки времени компиляции:)
Надеюсь, что это дает вам некоторые идеи!
EDIT
Я потратил некоторое время на размышления о проблеме, которую вы выдвинули в отношении времени сборки, и изменил сценарий предварительной сборки следующим образом:
$(ProjectDir)BuildTools\Xsd2Code.exe $(ProjectDir)Api\Schemas\MySchema.xsd MyProject.Api.Schemas $(ProjectDir)Api\Schemas\MySchema.cs.temp /platform Net40 /collection Array /sc+ /ap+ /if- /xa+
fc $(ProjectDir)Api\Schemas\MySchema.cs $(ProjectDir)Api\Schemas\MySchema.cs.temp
if errorlevel 1 copy $(ProjectDir)Api\Schemas\MySchema.cs.temp $(ProjectDir)Api\Schemas\MySchema.cs /Y
del $(ProjectDir)Api\Schemas\MySchema.cs.temp
Таким образом, Xsd2Code теперь генерирует исходный код во временный файл, который перезаписывает существующий файл .cs, только если он отличается. Это должно означать, что если .xsd вообще не изменился, то и сгенерированный .cs:)
не изменится.
Вы по-прежнему получаете удовольствие от запуска xsd2code, но вы не принимаете хит msbuild, перестраивая всю цепочку проектов, если сгенерированный исходный код был тем же.