原文:http://www.codeproject.com/dotnet/ilassembly.asp
创建和使用类对象
首先我们定义一个简单的类,它只包含一个方法用于计算一个整数的平方(square),代码如下:
.assembly
extern
mscorlib {}
.assembly MathLib
{
.ver
1
:
0
:
1
:
0
}
.module MathLib.dll
.
namespace
HangamaHouse
{
.
class
public
ansi auto MathClass extends [mscorlib]System.Object
{
.method
public
int32 GetSquare(int32) cil managed
{
.maxstack
3
ldarg.
0
//
加载对象的 this 指针到堆栈上
ldarg.
1
//
实例方法的实际的参数索引总是从 1 开始
ldarg.
1
mul
ret
}
}
}
然后用命令 ILAsm MathLib.il /dll 编译为一个 DLL.
调用的范例如下,这里创建了第一个 dll 里面的类对象,并调用其方法。
.assembly
extern
mscorlib {}
.assembly
extern
MathLib {.ver
1
:
0
:
1
:
0
}
//
//
rest code here
//
.method
static
void
Main() cil managed
{
.maxstack
2
.entrypoint
.locals init (valuetype [MathLib]HangamaHouse.MathClass mclass)
ldloca mclass
//
加载对象地址
ldc.i4
5
//
方法的参数
call instance int32 [MathLib]HangamaHouse.MathClass::GetSquare(int32)
ldstr
"
The Square of 5 Returned :
"
call
void
[mscorlib]System.Console::Write(
string
)
call
void
[mscorlib]System.Console::WriteLine(int32)
ret
}
构造器和属性
构造器是这样定义的:
.
class
public
MathClass extends [mscorlib]System.ValueType
{
.field
private
int32 mValue
//
其他代码。。
.method
public
specialname rtspecialname instance
void
.ctor() cil managed
{
ldarg.
0
//
加载 this 指针
ldc.i4.s
15
stfld int32 HangamaHouse.MathClass::mValue
//
保存到字段
ret
}
//
其他代码。。
可以看到,构造器实际上是一个叫做 .ctor 的特殊方法。以上代码中使用 specialname 和 rtspecialname 来标注它是一个特殊名称的方法。
在 IL 中,构造器是不会自动被调用的,你必须手工去调用它。下面是一个例子:
.method
public
static
void
Main() cil managed
{
.maxstack
2
.entrypoint
.locals init (valuetype [MathLib]HangamaHouse.MathClass mclass)
ldloca mclass
call instance
void
[MathLib]HangamaHouse.MathClass::.ctor()
属性的实现跟构造器类似,实际上也是方法。代码如下:
.method specialname
public
instance int32 get_Value() cil managed
{
ldarg.
0
ldfld int32 HangamaHouse.MathClass::mValue
ret
}
.method specialname
public
instance
void
set_Value(int32 ) cil managed
{
ldarg.
0
ldarg.
1
stfld int32 HangamaHouse.MathClass::mValue
ret
}
//
Define the property, Value
.property int32 Value()
{
.
get
instance int32 get_Value()
.
set
instance
void
set_Value(int32 )
}
使用属性其实就是调用以上代码中的 get_Value 和 set_Value 这两个方法:
.maxstack
2
.locals
init (valuetype [MathLib]HangamaHouse.MathClass tclass)
ldloca tclass
ldc.i4
25
call instance
void
[MathLib]HangamaHouse.MathClass::set_Value(int32)
ldloca tclass
call instance int32 [MathLib]HangamaHouse.MathClass::get_Value()
ldstr
"
Propert Value Set to :
"
call
void
[mscorlib]System.Console::Write(
string
)
call
void
[mscorlib]System.Console::WriteLine(int32)
(
To be continued)