C#支持的数学运算是加、减、乘、除、取模,它们对应的指令是
Add、Sub、Mul、Div、Rem。

这五个运算都需要两个参数,它们的通用步骤
1.生成加载左边变量
2.生成加载右边变量
3.生成运算指令

实例:

ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Ldarg_1);
ilGenerator.Emit(OpCodes.Sub);

完整的程序如下:

using System;
using System.Reflection;
using System.Reflection.Emit; namespace LX1_ILDemo
{
class Demo16_NumberOP
{
static string binaryName = "Demo16_NumberOP.exe";
static string namespaceName = "LX1_ILDemo";
static string typeName = "NumberOPDemo"; static AssemblyBuilder assemblyBuilder;
static ModuleBuilder moduleBuilder;
static TypeBuilder typeBuilder;
static MethodBuilder mainMethod;
static MethodBuilder testMethod; static void Emit_Test()
{
testMethod = typeBuilder.DefineMethod("TestOP", MethodAttributes.Public
| MethodAttributes.Static, typeof(void), new Type[] {typeof(double), typeof(double)});
var println= typeof(Console).GetMethod("WriteLine", new Type[] { typeof(double) });
var ilGenerator = testMethod.GetILGenerator();
ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Ldarg_1);
ilGenerator.Emit(OpCodes.Add);
ilGenerator.Emit(OpCodes.Call, println); ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Ldarg_1);
ilGenerator.Emit(OpCodes.Sub);
ilGenerator.Emit(OpCodes.Call, println); ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Ldarg_1);
ilGenerator.Emit(OpCodes.Mul);
ilGenerator.Emit(OpCodes.Call, println); ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Ldarg_1);
ilGenerator.Emit(OpCodes.Div);
ilGenerator.Emit(OpCodes.Call, println); ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Ldarg_1);
ilGenerator.Emit(OpCodes.Rem);
ilGenerator.Emit(OpCodes.Call, println); ilGenerator.Emit(OpCodes.Ret);
} public static void Generate()
{
InitAssembly();
typeBuilder = moduleBuilder.DefineType(namespaceName + "." + typeName, TypeAttributes.Public);
Emit_Test();
GenerateMain();
assemblyBuilder.SetEntryPoint(mainMethod, PEFileKinds.ConsoleApplication);
SaveAssembly();
Console.WriteLine("生成成功");
} static void GenerateMain()
{
mainMethod = typeBuilder.DefineMethod("Main", MethodAttributes.Public
| MethodAttributes.Static, typeof(void), new Type[] { });
var ilGenerator = mainMethod.GetILGenerator();
ilGenerator.Emit(OpCodes.Ldc_R8,(double));
ilGenerator.Emit(OpCodes.Ldc_R8, (double));
ilGenerator.Emit(OpCodes.Call, testMethod); ilGenerator.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadKey", new Type[] { }));
ilGenerator.Emit(OpCodes.Pop);
ilGenerator.Emit(OpCodes.Ret);
} static void InitAssembly()
{
AssemblyName assemblyName = new AssemblyName(namespaceName);
assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, binaryName);
} static void SaveAssembly()
{
Type t = typeBuilder.CreateType(); //完成Type,这是必须的
assemblyBuilder.Save(binaryName);
}
}
}

最新文章

  1. Ubuntu的多文件编译以及c语言的数组、函数
  2. [leetcode]Path Sum II
  3. QT学习入门笔记
  4. Using Text_IO To Read Files in Oracle D2k
  5. zoj 1450 Minimal Circle 最小覆盖圆
  6. Aborting a running program
  7. c# 字符串编码问题
  8. 使用xdebug+eclipse远程调试centOS7上的PHP代码
  9. 汇编条件判断整理(JCC,CMP/TEST的实现)
  10. 4.variables
  11. 19 Handler 子线程向主线程发送信息
  12. 解决记录:win10 无法安装VS2017,visual studio installer下载进度始终为0
  13. [原创]浅谈IT人如何做理财规划
  14. 【科普】GSM伪基站 劫持 诈骗?用4G网就安全?想强制用4G?最详细的科普教程在此!
  15. tomcat8做成windows服务
  16. 家庭版Windows设置远程连接
  17. 【php增删改查实例】第六节 - 部门管理模块(开始)
  18. Spring boot 中Hibernate 使用
  19. Python自定义状态码枚举类
  20. eject命令详解

热门文章

  1. 必懂的webpack高级配置
  2. .net持续集成sonarqube篇之 sonarqube触发webhook
  3. Linux常用命令3
  4. Angular JS 中 ng-controller 值复制和引用复制
  5. Android通过辅助功能实现抢微信红包原理简单介绍
  6. 提交bug的标准及书写规范
  7. Java中Timer和TimerTask来实现计时器循环触发
  8. 派胜OA二次开发笔记(1)重写主界面
  9. AUTOSAR学习之RTE - 基本概念
  10. 旁友数独会伐啦?python秒解数独了解下伐啦?