Question

I have a pre-build event on a C# project which runs xsltproc to transform some XML into C# source files. The generated source then gets built in the normal way. This means that the project always gets built regardless of whether the XML has changed.

Is there a way of only generating the C# classes if the XML has changed? Is a pre-build event the wrong approach? Would I be better off with a custom tool of some kind to turn the XML into C#?

I'm using Visual Studio 2010. The XML doesn't contain serialized objects.

Any help much appreciated.

Was it helpful?

Solution

In the end I added a new ItemGroup to my csproj file with references to each XML file. I gave each item an element name of Preprocess:

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

Later in the project file I overrode the BeforeBuild target, so that it transforms every Preprocess item into a C# source file with the same name as the XML file:

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

Note the arguments to xsltproc have to be escaped with %22.

Now the C# source file is only built if the XML has changed. I got the approach from this forum post.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top