Un ensamblador orientado a objetos =)
.assembly HelloWorld
{
}
.namespace ilamscosa
{
.class private auto ansi beforefieldinit MainClass
{
.method public hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 1
ldstr "Hola Ensamblador de .NET"
call void [mscorlib]System.Console::WriteLine(string)
ret
}
}
}
:D Hola mundo. un exe
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
.ver 2:0:0:0
}
.assembly extern System.Windows.Forms
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
.ver 2:0:0:0
}
//Mi Ensamblado
.assembly HM
{
.hash algorithm 0x00008004
.ver 1:0:0:0
}
.module HM.exe
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0002 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
.class private auto ansi beforefieldinit HolaMundo
extends [mscorlib]System.Object
{
.method public hidebysig static void Main(string[] Args) cil managed
{
//Establece que este metoido es el metodo de entrada ppal del
//ensamblado
.entrypoint
// Code size 19 (0x13)
.maxstack 8
ldstr \\\"CIL, bacano\\\"
call valuetype[System.Windows.Forms]
System.Windows.Forms.DialogResult
[System.Windows.Forms]
System.Windows.Forms.MessageBox::Show(string)
pop
ret
} // end of method HolaMundo::Main
//Contructor por defecto de la clase
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 8
ldarg.0
call instance void [mscorlib]System.Object::.ctor()
ret
} // end of method HolaMundo::.ctor
} // end of class HolaMundo
Ejercicio creando una dll.
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
.ver 2:0:0:0
}
//Referenciar System.Windows.Forms
.assembly extern System.Windows.Forms
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
.ver 2:0:0:0
}
//Definiendo ensamblado simple de un archivo
.assembly CILCars
{
.hash algorithm 0x00008004
.ver 1:0:0:0
}
.module CILCars.dll
//Implementacion
.namespace CILCars
{
.class public auto ansi beforefieldinit CILCar
extends [mscorlib]System.Object
{
//Definicion de campos
.field public string petName
.field public int32 currSpeed
//Constructor sencillo
.method public hidebysig specialname rtspecialname
instance void .ctor(int32 c, string p)cil managed
{
.maxstack 8
//Cargar primer argumento al stack
ldarg.0// es el objeto this, siempre pasado como oculto de primer parametro
//llamar al constructor de la clase padre
call instance void[mscorlib]System.Object::.ctor();
//Ahora cargar 1er y 2do argumento al stack
ldarg.0//this siempre se pasa como parametro
ldarg.1//int32
//almacenar la punta de la pila (int 32) a la variable miembro (field) currSpeed
stfld int32 CILCars.CILCar::currSpeed
//Asignar ahora la variable petName
ldarg.0//this siempre se pasa como parametro
ldarg.2//string
stfld string CILCars.CILCar::petName
ret
}
}
.class public auto ansi beforefieldinit CILCarInfo
extends [mscorlib]System.Object
{
//Definiendo un mestodo estatico
.method public hidebysig static void
Display(class CILCars.CILCar c) cil managed
{
.maxstack 8
//definiendo variable local
.locals init ([0] string caption)
//Cargar el valor de CILCar del auto en el stack
ldstr \"{0}\'s speed is: \"
//Manda del CILCar al stack (el puntero desde luego)
ldarg.0
//Ahora se coloca el valor de CILCar.petName en el stack
//y se llama a statis String.Format(string, object)
ldfld string CILCars.CILCar::petName
call string [mscorlib]System.String::Format(string, object)
stloc.0
//Ahora cargo el valor de currSpeed en el stack y obtengo su representacion
//alfabetica
//Enviar el objecto que accedere al stack (CILCar)
ldarg.0
//Enviar la direccion de la variable que necesito ya que
//ToString requiere la direccion en la cima del stack
ldflda int32 CILCars.CILCar::currSpeed
//ahora llamo a ToString
call instance string [mscorlib]System.Int32::ToString()
//Lo guardo en mi variable local
ldloc.0
//Ahora llamo al msgbox par que muestre lo necesario
call valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult
[System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string, string)
pop
ret
}
}
}
:D Una interfaz en una dll.
.assembly extern mscorlib{}
//Mi ensamblado
.assembly CILTypes
{
.ver 1:0:0:0
}
.module CILTypes.dll
//Ensamblado de Windows GUI
.subsystem 0x0002
.namespace Entrenamiento
{
.namespace MiNamespace{}
}
.namespace MiNamespace
{
//Definicion de tipos base
.class public MiClaseBase{}
.class public interface IMiInterface{}
//Definicion de tipos heredados | implementados
.class public MiClaseDerivada
extends MiNamespace.MiClaseBase
implements MiNamespace.IMiInterface{}
//Definicion de una estructura
.class public sealed MiEstructura1 extends [mscorlib]System.ValueType{}
.class public value MiEstructura2{}
//Definicion de enums
.class public sealed MiEnum1 extends [mscorlib]System.Enum{}
.class public enum MiEnum2{}
}
Cita de: JuanK_solocodigo en 19 Agosto 2006, 00:38 AM
:D Una interfaz en una dll.
.assembly extern mscorlib{}
//Mi ensamblado
.assembly CILTypes
{
.ver 1:0:0:0
}
.module CILTypes.dll
//Ensamblado de Windows GUI
.subsystem 0x0002
.namespace Entrenamiento
{
.namespace MiNamespace{}
}
.namespace MiNamespace
{
//Definicion de tipos base
.class public MiClaseBase{}
.class public interface IMiInterface{}
//Definicion de tipos heredados | implementados
.class public MiClaseDerivada
extends MiNamespace.MiClaseBase
implements MiNamespace.IMiInterface{}
//Definicion de una estructura
.class public sealed MiEstructura1 extends [mscorlib]System.ValueType{}
.class public value MiEstructura2{}
//Definicion de enums
.class public sealed MiEnum1 extends [mscorlib]System.Enum{}
.class public enum MiEnum2{}
}
una duda eso como se compila , en que tipo de próyecto. :P
teniendo instalado el .net framework sdk:
ilasm /exe ensamblado.il
las librerias
ilasm /dll ensamblado.il
eso es lo básico desde luego hay opciones mas avanzadas para las referencias etc.
En Visual Studio no hay ninguna opcion que te permita hacer proyectos con IL, pero en Sharp Develop hay una, no muy completa pero si muy estable.