![]() |
Languages »
MSIL »
General
Intermediate
A simple introduction to the .NET Intermedia Language (IL)By Filip BulovicA simple example of using IL directly |
Windows, .NET 1.0, Dev
|
|
Advanced Search |
|
|
|
||||||||||||||||
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".
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.
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.
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 2 Sep 2001 Editor: Chris Maunder |
Copyright 2001 by Filip Bulovic Everything else Copyright © CodeProject, 1999-2009 Web13 | Advertise on the Code Project |