Click here to Skip to main content
Click here to Skip to main content
Go to top

A simple introduction to the .NET Intermedia Language (IL)

, 2 Sep 2001
Rate this:
Please Sign up or sign in to vote.
A simple example of using IL directly

Introduction

To compile and run the code you must have installed Microsoft .NET Framework Beta 2. This is available for download from http://msdn.Microsoft.com.

When I received copy of Visual Studio .NET Beta 2 I did not manage to find the ILAssemblyLanguageProgrammersReference.doc which was included in beta 1, so I decided to share my experience with other assembly enthusiasts. Other documents for those interested in intermediate language can be find in: " C:\Program Files\Microsoft.NET\FrameworkSDK\Tool Developers Guide\docs".

Tips

Typically you would  work with assembler from the command line and using notepad. To open a command line in any directory create a registry entry (key) in "HKEY_CLASSES_ROOT\Folder\shell" called "CmdLine" and add a new entry in CmdLine called "command". Change the (Default) to string value REG_SZ to "cmd.exe %1". This allows you to open a command line using the context menu (right click on folder icon and select CmdLine). It is also handy to create a shortcut to Notepad.exe and ildasm.exe in "C:\Documents and Settings\whatever your name is\SendTo" so that you can send .il files to notepad and .exe files to the disassembler.

An example IL file

First we will write a client and from the client send a string to ArgIn.dll (a library we will create below) which will display our string in a message box. Copy the following, paste it in notepad and save it as client.il

.assembly extern mscorlib{}
.assembly extern ArgIn{}
.assembly go{}
.method public static void GO2() cil managed	//any name starting with letter is ok
{
   .entrypoint		//must
   .maxstack  1
   //you can safely comment out .maxstack  1 or set it to 2, but if it is 
   // insufficient it results in a run-time error
   .locals ([0] class [ArgIn]ArgIn.Class1 q)
   //.locals  [init] ( <localsSignature> )	Defines a set of local variables for this method.
   ldstr "Hello from client"	
   //72 <T> ldstr string	push a string object for the literal string
   newobj instance void [ArgIn]ArgIn.Class1::.ctor(string)
   //73 <T> newobj ctor	allocate an uninitialized object and call ctor  
   stloc.0	
   //0A	stloc.0	Pop value from stack into local variable 0.	
   //   pop will also do here (we won't use it again)
   ret	     //return is a must
}

Do not compile yet. First we must compile the library. The following is the library that we are going to compile to ArgIn.dll :

.assembly extern mscorlib
{}
.assembly extern System.Windows.Forms
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         
  .ver 1:0:2411:0
}
.assembly ArgIn
{}
.namespace ArgIn
{
  .class public auto ansi beforefieldinit Class1
         extends [mscorlib]System.Object
  {
    .method public hidebysig specialname rtspecialname 
            instance void  .ctor(string msg) cil managed
    {
        //.maxstack  8
        ldarg.0
        call       instance void [mscorlib]System.Object::.ctor()
        ldarg.1
        ldstr      "From dll"
        call       valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult 
                        [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string,string)                                                                                                                                              
        pop
        ret
    }

  }

}

Save this as ArgIn.il. To compile simply type on command line "ilasm ArgIn /dll". 

The section 

.assembly extern System.Windows.Forms 

deserves additional explanation. This is value on my machine, if it does not work on yours copy and paste in notepad following:

using System;
using System.Windows.Forms;
class try1
{
public static void Main()
	{
	   MessageBox.Show ("Test", "Test app");
	}
}

save it as test.cs and compile from command line typing "csc test.cs". Send test.exe to ildasm and check what is in the MANIFEST (double click on it). If it is necessary copy the correct values and apply it in your code.

Now it is time to compile the client application. ArgIn.dll must be in the same folder as the exe. From command line execute "ilasm client.il" and run client.exe. You will see message box with the message "Hello from client" and title "From dll". 

It's that easy!

I hope that you will find that IL assembler is very friendly and write some code on your own. At the end I wish to thank Microsoft for making .NET platform available to public, my company Objectronics for providing me with their copy of .NET Framework Beta 2 and finally to my dear friend Dmitri Vibornov for idea and his help on coding and preparing this article.

If you have any question or suggestion I can be reached at filipbulovic@hotmail.com if time allows I will come back to you.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

Filip Bulovic

United States United States
VB programmer

Comments and Discussions

 
-- There are no messages in this forum --
| Advertise | Privacy | Mobile
Web02 | 2.8.140916.1 | Last Updated 3 Sep 2001
Article Copyright 2001 by Filip Bulovic
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid