我们将对下面这个带简单条件判断的方法使用ILGeneral在运行期生成
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
简单的带if函数public void f()
{
int i;
i = 1;
if (i > 0)
i = 0;
return;
}
1. 定义本地变量
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
定义整型变量iLocalBuilder myLB2 = methodIL.DeclareLocal(typeof(int));
myLB2.SetLocalSymInfo("i");
2. 对变量赋值
使用LDC_I4_0将整数1压到栈上
将栈上的值pop,赋值给本地变量LOC_0 (i)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
对变量赋值methodIL.Emit(OpCodes.Ldc_I4_1);
methodIL.Emit(OpCodes.Stloc_0);
3. 分支语句需要一个标签(Label)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
定义标签Label lb = methodIL.DefineLabel();
4. 判断 i > 0 的结果
将本地变量i的值压到栈上
将整数0压到栈上
判断i是否比0大,如果是,1将会被压到栈上,否则0被压到栈上
如果栈上是0,执行语句将被跳到标签
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
判断结果,选择分支methodIL.Emit(OpCodes.Ldloc_0);
methodIL.Emit(OpCodes.Ldc_I4_0);
methodIL.Emit(OpCodes.Cgt);
methodIL.Emit(OpCodes.Brfalse, lb);
5. 分支语句
简单的赋值操作
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
实际执行的分支语句methodIL.Emit(OpCodes.Ldc_I4_0);
methodIL.Emit(OpCodes.Stloc_0);
6. 标签
没有进入分支语句的话将跳跃执行到这一步:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
实际执行的分支语句methodIL.MarkLabel(lb);
7. 返回