I have been dealing with IL generation using Reflection Emit for about two years. I believe that I have enough experience with it to get a feeling for how it goes, and it usually goes slowly and painfully. There are wrappers around it (Castle Dynamic Proxy has a AST for this), but they are fairly specialized, and anyone somehow I always find myself needing to fix the code that build the AST, mostly because I have users that throws weird curve balls at Rhino Mocks.
Nevertheless, IL generation is a powerful technique, just very cumbersome to deal with. RunSharp is a OSS project that aims to solve this issue, it generate code on the fly, using high-level syntax.
This means that you can write code like this:
g.Assign(x, o.Invoke("MyMethod", arg1, arg2)); g.Assign(y, o.Property("MyProperty")); g.Assign(o.Property("MyProperty"), z); g.Assign(f, o.Field("myField"));
And it will generate the appropriate:
x = o.MyMethod(arg1, arg2); y = o.MyProperty; o.MyProperty = z; f = o.myField;
I am impressed, if this works, it can mean some very interesting possibilities. I took a very brief glance at the code, and it is using the ILGenerator from the framework, I would be very interested in getting this to work on (a) dynamic methods, (b) cecil.
The license is GPL, however, which means that it is a problem to use in any scenario. In my opinion, such a thing should be LGPL, which would allow its use in other projects, but that is a subject for another day.
Thanks Roy, for finding it.