3 Gems in Mono for .NET Programmers – The hidden potential of Mono.CSharp, Mono.Cecil And Mono.TextTemplating


ANOOP MADHUSUDANAN

Vote on HN

image Mono is getting more mature. I should say, Mono guys are even outshining their Microsoft counterparts in some areas. For example, Mono’s C# compiler already supports Compiler as a Service. In this post, we’ll have a quick look at some interesting Mono libraries that you can use in your .NET projects, to take advantage of some of their functionalities, that is not present in the .NET stack.

1 - Mono.CSharp – For Compiler as a Service and C# as a scripting language

Anders in his C# Futures Talk mentioned about C# Compiler as a Service and demonstrated an REPL (Read Evaluation Print Loop) implementation. And few months back, I got pretty surprised when I found that Mono announced Compiler as a Service support. This will enable you to evaluate C# code on the fly, and more importantly, to use C# as a scripting language in your applications. Here is a step by step guide to this feature.

2 - Mono.TextTemplating – For T4 (Text Templating) Functionality in your .NET applications

In a lot of scenarios, a custom text template processor comes in handy. I remember putting together a simple, custom Text template processor some time back for generating Emails. With in Visual Studio, there is a Text Templating transformation engine built in, better known T4. It is used for a lot of scenarios, mainly for generating code from Models, and is used in various VS Packages for code generation purposes. You can also write your own Template files (*.tt) with in Visual Studio, and Clarius has a cool T4 Editor available for Visual Studio.

All is good. But what if you want to implement some templating functionality in your own applications? We can’t use the Microsoft.VisualStudio.TextTemplating libraries, because I don't believe that T4 can be legally redistributed without Visual Studio. But you can rely on Mono equivalent T4 implementation,Mono.TextTemplating

And, if you want to see an example, you should check out a Custom View Engine I developed for ASP.NET MVC using Mono.TextTemplating and the related example code. More than an ASP.NET MVC View Engine example, it is also an example of how to host the T4 Engine in your own applications.

3 - Mono.Cecil – For Modifying .NET Assemblies, And a better alternative to .NET Reflection

If you use .NET Reflection heavily, you should have a look at Mono.Cecil.  You can also use Mono.Cecil to modify a compiled assembly, or to weave some code in to your assemblies (AOP) directly. To try out Cecil, get the latest version 0.9 from Github and compile Mono.Cecil library in VS2010.

Now, create a console application in Visual Studio, and try this example after adding a reference to Mono.Cecil.dll. 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Mono.Cecil;

namespace CecilAppTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //Open a given assembly. Let us assume the
            //first command line param is the path to the assembly to load and inspect
            AssemblyDefinition assemblyDefinition = AssemblyDefinition.ReadAssembly(args[0]);

            //All Modules in this assembly
            foreach (var modDef in assemblyDefinition.Modules)
            {
                Console.WriteLine(" +--Module {0}", modDef.Name);
                //All types in this module
                foreach (var typeDef in modDef.Types)
                {
                    Console.WriteLine("   +--Type {0}", typeDef.Name);
                    //All methods in this type
                    foreach (var methodDef in typeDef.Methods)
                    {
                        Console.WriteLine("      --Method {0}", methodDef.Name);
                    }
                    //All properties in this type
                    foreach (var propDef in typeDef.Properties)
                    {
                        Console.WriteLine("      --Property {0}", propDef.Name);
                    }
                }
            }
        }
    }
}

Compile the above example, and try it against a .NET dll to see the output, by providing the target assembly’s path

The above example shows how to iterate through all modules, types, methods and properties in an assembly using Mono.Cecil. What is more interesting is, you can even modify the information and even save it back. Paul has a good post on using Cecil to obfuscate your .NET assemblies. Also, have a look at his NCloak obfusctor, it is open source, that is built leveraging Cecil’s power.

Also, check out my C# AccessPrivateWrapper where I explore how to use reflection to access private classes, variables etc.

© 2012. All Rights Reserved. Amazedsaint.com