So what’s the problem?
Visual Studio has .tt files – so called T4 templates and they are great – generate your code on the fly. Right? Well… sorta. .tt files do that on Ctrl+ S /Save and that’s it. Not exactly on the fly….
And Microsoft does have Modeling SDK for vs2013 or vs2012 that allow for transform on build. But there are potential risks involved like: If you use an .dll that you generate with a previous build project and want it to be dynamic as in when you change the first project the .tt file that uses it to regenerate the result based on the new .dll. But if you include an dll inside of .tt, say like this msbuild loads it in memory and locks it and it can not get changed on the fly like you need it to.
ProjectFoo -> copy result to ..\path\to\foo\bar\Foo.dll
template.tt -> assembly name=”..\path\to\foo\bar\Foo.dll -> generate code as you expect it to
build 1 – Foo.dll gets locked inside of msbuild.exe process
build 2 – try copy result to ..\path\to\foo\bar\Foo.dll but to no avail – it is locked inside of the msbuild process
Or maybe you want to control more closely what and how to generate your files.
Building on top of a great blog I came up with This .targets file for use with visual studio proj files.
How to use it?
- Add .tt file and add in it all the assemblies that you need. Using VS standart tt transforming make it the way that you need it
- After thar remove the assembly references and remove the custom tool (file properties inside vs) for VS to not try and fail every time you save the tt in generating it
- Unload/Edit the project and add reference to the targets file and a list of all dlls needed for your tt inside of proj file like in this csproj file See the end of file.
- Build your project and voila – you have code generated on build