Friday, December 16, 2011

Code generation in C#

I wrote my first code generator on the weekend. The real work - generating the C# class files - was trivial. Getting the generator into a state so that it could be easily used was more difficult.

There are a few ways you could do code generation in .NET. I explored:
I went with T4 Templates. They were a little obscure at first but provided the easiest entry point into using the code generator. You just build-up your source file and then right-click and select "Run Custom Tool" on the .tt file to generate the code.

I encounted a few issues when trying to write my template. They were:
  • Extension methods can't be embedded into a T4 Template. There is a workaround. I ended up converting my extension methods into normal methods (I only had two).
  • Accessing your assemblies is difficult in Visual Studio 2010. It has been explained very well. I managed to access my assemblies by writing something like <#@ assembly name="$(SolutionDir)..\DomainEntities\bin\Debug\Cpa.DomainEntities.dll" #>
The example T4 Templates I found on the Internet were a little more complex than what I wanted. (Examples should be as simple as possible.) I wanted to load a source file into memory and generate class files from that. Download my example template if you want something similar. It loads in a CSV file that has two columns (first column is the name of the class, second column the name of the property) and generates some puesdo-code of what the class files will eventually look like. I used this as my base template, then expanded it to create proper C# class files.




3 comments:

  1. good articles here hopefully i learned from it.

    ReplyDelete
  2. Thanks for sharing such a informative post. This will help me a lot. Thanks

    ReplyDelete
  3. I'm glad people are taking conscience of the need of code generation to speed software development processes.

    Take a look at http://www.radarc.net, a free Visual Studio extension, free for personal use. It will generate a complete N-Layer app from an EF model. You can choose to generate an ASP.NET MVC, Webforms, Azure or even a WP7 app.

    Check it out and tell us what you think, Thank you!

    ReplyDelete