Skip to main content

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

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.

Popular posts from this blog

Top 7 Coding Standards & Guideline Documents For C#/.NET Developers

Some time back, I collated a list of 7 Must Read, Free EBooks for .NET Developers, and a lot of people found it useful. So, I thought about putting together a list of Coding Standard guidelines/checklists for .NET /C# developers as well.As you may already know, it is easy to come up with a document - the key is in implementing these standards in your organization, through methods like internal trainings, Peer Reviews, Check in policies, Automated code review tools etc. You can have a look at FxCop and/or StyleCop for automating the review process to some extent, and can customize the rules based on your requirements.Anyway, here is a list of some good Coding Standard Documents. They are useful not just from a review perspective - going through these documents can definitely help you and me to iron out few hidden glitches we might have in the programming portion of our brain. So, here we go, the listing is not in any specific order.1 – IDesign C# Coding StandardsIDesign C# coding stand…

Creating a quick Todo listing app on Windows using IIS7, Node.js and Mongodb

As I mentioned in my last post, more and more organizations are leaning towards Web Oriented Architecture (WOA) which are highly scalable. If you were exploring cool, scalable options to build highly performing web applications, you know what Node.js is for.After following the recent post from Scott Hanselman, I was up and running quickly with Node.js. In this post, I’ll explain step by step how I’ve setup Node.js and Mongodb to create a simple Todo listing application.Setting up Node.jsThis is what I’ve done.1 – Goto, scroll down and download node.exe for Windows, and place it in your c:\node folder2 – Goto IIS Node project in Git at, download the correct ‘retail’ link of IIS Node zip file (I downloaded the already built retail package, otherwise you can download and build from the source).3 – Extract the zip file some where, and run the install.bat or install_iisexpress.bat depending on your IIS Version. If you don’t have IIS in…

MVVM - Binding Multiple Radio Buttons To a single Enum Property in WPF

I had a property in my View Model, of an Enum type, and wanted to bind multiple radio buttons to this.

Firstly, I wrote a simple Enum to Bool converter, like this.

public class EnumToBoolConverter : IValueConverter { #region IValueConverter Members public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (parameter.Equals(value)) return true; else return false; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return parameter; } #endregion }

And my enumeration is like

public enum CompanyTypes { Type1Comp, Type2Comp, Type3Comp } Now, in my XAML, I provided the enumeration as the ConverterParameter, of the Converter we wrote earlier, like