(转+整理)C#中动态执行代码
通过微软提供的CSharpCodeProvider,CompilerParameters,CompilerResults等类,可以在运行时,动态执行自己写的代码文件。原理就是把你的代码文件动态编译成exe或dll,或者在内存中输出,然后通过Assembly进行反射,执行其中的方法或访问其中的属性等。
界面有两个按钮,一个执行ShowMessage方法,另一个执行ShowForm方法,代码如下:
需引入
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.CSharp;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Reflection;
namespace CodeTest
{
public partial class Test : Form
{
public Test()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();
CompilerParameters objCompilerParameters = new CompilerParameters();
objCompilerParameters.ReferencedAssemblies.Add("System.dll");
objCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
objCompilerParameters.GenerateExecutable = false;
objCompilerParameters.GenerateInMemory = true;
CompilerResults cresult = objCSharpCodePrivoder.CompileAssemblyFromSource(objCompilerParameters, textBox1.Text);
if (cresult.Errors.HasErrors)
{
foreach (CompilerError err in cresult.Errors)
{
MessageBox.Show(err.ErrorText);
}
}
else
{
// 通过反射,执行代码
Assembly objAssembly = cresult.CompiledAssembly;
object obj = objAssembly.CreateInstance("CodeTest.Test");
MethodInfo objMI = obj.GetType().GetMethod("ShowMessage");
objMI.Invoke(obj, new object[] { "This is CodeTest!" });
}
}
private void Form1_Load(object sender, EventArgs e)
{
textBox1.Text = "using System;" + Environment.NewLine +
"using System.Windows.Forms;" + Environment.NewLine +
Environment.NewLine +
"namespace CodeTest" + Environment.NewLine +
"{" + Environment.NewLine +
" public partial class Test" + Environment.NewLine +
" {" + Environment.NewLine +
'\t' + "public void ShowMessage(string msg)" + Environment.NewLine +
'\t' + "{" + Environment.NewLine +
'\t' + " MessageBox.Show(msg);" + Environment.NewLine +
'\t' + "}" + Environment.NewLine +
Environment.NewLine +
'\t' + "public void ShowForm()" + Environment.NewLine +
'\t' + "{" + Environment.NewLine +
'\t' + " Form frm = new Form();" + Environment.NewLine +
'\t' + " frm.Show();" + Environment.NewLine +
'\t' + "}" + Environment.NewLine +
" }" + Environment.NewLine +
"}";
}
private void button2_Click(object sender, EventArgs e)
{
CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();
CompilerParameters objCompilerParameters = new CompilerParameters();
objCompilerParameters.ReferencedAssemblies.Add("System.dll");
objCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
objCompilerParameters.GenerateExecutable = false;
objCompilerParameters.GenerateInMemory = true;
CompilerResults cresult = objCSharpCodePrivoder.CompileAssemblyFromSource(objCompilerParameters, textBox1.Text);
if (cresult.Errors.HasErrors)
{
foreach (CompilerError err in cresult.Errors)
{
MessageBox.Show(err.ErrorText);
}
}
else
{
// 通过反射,执行代码
Assembly objAssembly = cresult.CompiledAssembly;
object obj = objAssembly.CreateInstance("CodeTest.Test");
MethodInfo objMI = obj.GetType().GetMethod("ShowForm");
objMI.Invoke(obj, null);
}
}
}
}
点击按钮“执行代码”,运行结果如下:
点击按钮“显示窗体”,代码执行如下:
因为自定义代码中有
using System;
using System.Windows.Forms;
需要上面两个类库才能执行,所以要在CompilerParameters中对这两个dll添加引用,既
objCompilerParameters.ReferencedAssemblies.Add("System.dll");
objCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
反射时,命名空间的名字要写完整,实例中命名空间是CodeTest,类是Test,所以反射代码是objAssembly.CreateInstance("CodeTest.Test")
文章转载自https://blog.csdn.net/bdmh/article/details/22398077
(转+整理)C#中动态执行代码的更多相关文章
- 在VB中动态执行VBS代码,可操控窗体控件
通过执行一段VBS代码来操控窗体内的控件也可以使用AddObject方法添加自己的类,那么在动态VBS代码中也一样可以使用在增加程序扩展性或是有脚本化需求的时候,这个方法还是不错的. Option E ...
- C#动态执行代码
在开始之前,先熟悉几个类及部分属性.方法:CSharpCodeProvider.ICodeCompiler.CompilerParameters.CompilerResults.Assem ...
- SQLSERVER 在PROCEDURE 中动态执行SQL语句【EXEC】并获取
1.直接上代码 CREATE PROCEDURE [dbo].[TEST] AS BEGIN DECLARE )='N8-4F', --構建SQL需要的條件 ),--構建後的SQL語句 @cnt in ...
- Oracle 函数中动态执行语句
函数: 1 create or replace function fn_test(tablename in varchar2) return number is sqls ); rtn ):; beg ...
- Jmeter4.0---- jmeter中写入java代码_简单了解(15)
1.说明 BeanShell:是一个小型嵌入式Java源代码解释器,具有对象脚本语言特性,能够动态地执行标准JAVA语法,并利用在JavaScript和Perl中常见的的松散类型.命令.闭包等通用脚本 ...
- 动态执行SQL语句,接收返回值
一.exec和sp_executesql介绍 当需要根据外部输入的参数来决定要执行的SQL语句时,常常需要动态来构造SQL查询语句.比如,一个比较通用的分页存储过程,可能需要传入表名,字段,过滤条件, ...
- [Unity] 编辑器运行中动态编译执行C#代码
(一)问题 之前写Lua时,修改完代码 reload 就可以热重载代码,调试起来十分方便(重构则十分痛苦). 现在使用 C# 做开发,目前还没找到比较方便地进行热重载的方式.只能退而求其次,在调试上找 ...
- 页面动态加入<script>标签并执行代码
在页面中动态追加html片段的时候,有时候动态添加的代码会含有<script>标签,比如用了一些模板引擎,或者你的代码有些复杂的时候.然而我们用DOM提供的innerHTML方式来添加代码 ...
- C#动态执行字符串(动态创建代码)
在编写C#程序的时候,有时我们需要动态生成一些代码并执行.然而C#不像JavaScript有一个Eval函数,可以动态的执行代码.所有这些功能都要我们自己去完成.如下是实例. 动态创建代码: usin ...
随机推荐
- Python 3 实现色情图片识别
Python 3 实现色情图片识别 项目简介 项目内容 本实验将使用 Python3 去识别图片是否为色情图片,我们会使用到 PIL 这个图片处理库,会编写算法来划分图像的皮肤区域. 项目知识点 Py ...
- poj 1456 Supermarket - 并查集 - 贪心
题目传送门 传送点I 传送点II 题目大意 有$n$个商品可以销售.每个商品销售会获得一个利润,但也有一个时间限制.每个商品需要1天的时间销售,一天也只能销售一件商品.问最大获利. 考虑将出售每个物品 ...
- Codeforces 844D Interactive LowerBound - 随机化
This is an interactive problem. You are given a sorted in increasing order singly linked list. You s ...
- eval()、exec()与execfile()
eval(expression[, globals[, locals]]) eval()函数执行一个python表达式字符串并返回表达式执行后的结果: >>> x = 1 >& ...
- 深刻理解Python中的元类(metaclass)以及元类实现单例模式
在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍 ...
- Python3基础 filter+lambda 筛选出1-20之间的奇数
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- CodeForces 509C Sums of Digits(贪心乱搞)题解
题意:a是严格递增数列,bi是ai每一位的和,告诉你b1~bn,问你怎样搞才能让an最小 思路:让ai刚好大于ai-1弄出来的an最小.所以直接模拟贪心,如果当前位和前一个数的当前位一样并且后面还能生 ...
- 完全卸载oraclean安装
完全卸载oracle11g步骤:1. 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务.2. 开始->程序->Oracle - OraHome ...
- Google advertiser api开发概述——批量处理
批处理 大多数服务都提供同步 API,要求您发出请求然后等待响应,但 BatchJobService 允许您对多项服务执行批量操作,而无需等待操作完成. 与各服务的特定 mutate 操作不同,Bat ...
- ZooKeeper分布式过程协同技术详解1——ZooKeeper的概念和基础
简介 分布式系统和应用,不仅能提供更强的计算能力,还能为我们提供更好的容灾性和扩展性. ZooKeeper是Google的Chubby项目的开源实现,它曾经作为Hadoop的子项目,在大数据领域得到广 ...