While working on an XML project, I wanted to call xsd.exe on an .xsd file during the build process, and found this solution on SO, which works for VS 2010.
For VS 2013, the solution did not work anymore, especially on systems that had no prior version of VS installed, since xsd.exe hides in a different location.
A comment to the answer illustrated how to query the registry correctly on x64 systems.
So my modified pre-build event looks like this:
call "$(ProjectDir)GenerateFromVSPrompt.cmd" "$(ProjectDir)" "$([MSBuild]::GetRegistryValueFromView( 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v8.1A', 'InstallationFolder', null, RegistryView.Registry64, RegistryView.Registry32) )bin\NETFX 4.5.1 Tools\xsd.exe"
all in 1 line.
If you use TFS as source control, you know that generated files need to be checked out before they can be overwritten.
I already wrote about TFS and code generation, and used the vcvarsall.bat then.
However, since we just need the path to tf.exe, and use the same VS version, we can just open a VS Command Prompt, run
and get the answer
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\TF.exe
for VS 2013.
So our batch file GenerateFromVSPrompt.cmd looks like this:
set tf="C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\TF.exe"
%tf% checkout %1MyXsdClasses.cs call %1XSDBuilder.cmd %1 %2
%tf% checkin /comment:"build event" /noprompt %1MyXsdClasses.cs
In case tf.exe cannot check in the file because it did not change during code generation, it will return with exit code 1 which in turn will cause the build process to issue a build error and break. So we use exit 0 to clear the error condition
Finally, my version of XSDBuilder.cmd is based on an SO answer, but stripped down to only what is necessary, since I only have 2 XSD files, AND they need to be processed together:
%2 MyXsd1.xsd MyXsd2.xsd /c /n:My.Project.Xsd
and, as I write, I really should merge both .cmd files into one … 😉
The build event is now executed correctly from VS, the VS Command Prompt, and on the build server.