C#实现动态编译代码
/*------------------------------------------------------------------------------
* Copyright (C) 2013
* 版权所有。
*
* 文件名: Compile.cs
* 功能說明:
*
* 創建人: it_Eric
* 創建時間: 2013/10/25 16:19:52
*
* 修改人:
* 修改說明:
*
*-----------------------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.IO;
using System.Reflection; namespace TestDemo
{
public class Compile
{
private string prefix = "using System;" +
"public static class Driver" +
"{" +
"public static void Run()" +
"{";
private string postfix =
"}" +
"}";
public string CompileAndRun(string input, out bool hasError)
{
hasError = false;
string returnData = null; CompilerResults results = null;
using (var provider = new CSharpCodeProvider())
{
var options = new CompilerParameters();
options.GenerateInMemory = true;
var sb = new StringBuilder();
sb.Append(prefix);
sb.Append(input);
sb.Append(postfix);
results = provider.CompileAssemblyFromSource(options, sb.ToString());
}
if (results.Errors.HasErrors)
{
hasError = true;
var errorMessage = new StringBuilder();
foreach (CompilerError error in results.Errors)
{
errorMessage.AppendFormat("{0}{1}", error.Line, error.ErrorText);
returnData = errorMessage.ToString();
} }
else
{
TextWriter temp = Console.Out;
var writer = new StringWriter();
Console.SetOut(writer);
Type drivertype = results.CompiledAssembly.GetType("Driver");
drivertype.InvokeMember("Run", System.Reflection.BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, null, null, null); Console.SetOut(temp);
returnData = writer.ToString(); }
return returnData;
} }
}
C#实现动态编译代码的更多相关文章
- C#动态编译代码,执行一个代码片段,或者从指定文件中加载某个接口的实现类
在项目进行中有时候会需要配置一些复杂的表达式,在程序运行的时候执行表达式,根据结果执行相应的操作,简单写了一个类Expression,利用.net的动态编译技术实现,代码如下: public clas ...
- 使用 Roslyn引擎动态编译代码
Roslyn引擎自2014年开源至今这么久,一直没怎么了解过,虽然VS2015早就集成了它. 以前老一套的动态编译方法在 .NET Core中似乎不再支持了,很多方法都是未实现的.下面就介绍如何在.N ...
- 用eval 动态编译代码
eval 有另外一种用法, 其参数是作为一个字串表达式, 而不是代码块.在运行时, 它将字串临时编译成代码并且执行. 这很易用, 但也很危险, 因为有可能会把具有危害性的代码放到字串里. foreac ...
- 让C#语言充当自身脚本!——.NET中的动态编译
原文:让C#语言充当自身脚本!--.NET中的动态编译 代码的动态编译并执行是.NET平台提供给我们的很强大的一个工具,用以灵活扩展(当然是面对内部开发人员)复杂而无法估算的逻辑,并通过一些额外的代码 ...
- 分享基于.NET动态编译&Newtonsoft.Json封装实现JSON转换器(JsonConverter)原理及JSON操作技巧
看文章标题就知道,本文的主题就是关于JSON,JSON转换器(JsonConverter)具有将C#定义的类源代码直接转换成对应的JSON字符串,以及将JSON字符串转换成对应的C#定义的类源代码,而 ...
- .Net 动态编译(c# 脚本)
1 用.NET提供的类动态编译代码字符串,生成DLL存于内存中,加载到程序域 2 用反射的方式调用这个DLL 将要被编译和执行的代码读入并以字符串方式保存声明CSharpCodeProvider对象实 ...
- java动态编译——tools.jar问题
笔者在学习中写了一段简单的动态编译代码,但编译一直无法通过,起初认为受路径中存在汉字影响,修改路径后仍然没有解决.最终定位错误是:Java在进行动态编译的时候需要用到tools.jar资源包,若too ...
- (转载)JAVA动态编译--字节代码的操纵
在一般的Java应用开发过程中,开发人员使用Java的方式比较简单.打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行Java 程序就可以了.这种开发模式背后的过程是:开发人员编写的 ...
- [改善Java代码]慎用动态编译
建议17: 慎用动态编译 //=========这篇博文暂时理解不透......... 动态编译一直是Java的梦想,从Java 6版本它开始支持动态编译了,可以在运行期直接编译.java文件,执行. ...
随机推荐
- Linux 修改终端显示bash-1.4$
先取得root权限,然后在终端如下操作[root@host]$su -然后输入密码接着[root@host]#PS1='[\u@\H \W]\$' 你取得root权限后在,在终端命令下输入这个,一定要 ...
- Tomcat 监控的几种方法
Tomcat 监控方法 方法1:.使用tomcat自带的status页 具体方法: 步骤1:修改%tomcat安装路径%\conf \tomcat-users文件,配置admin设置权限.在<t ...
- Java教程到处都是,究竟怎样能学好Java?
学习Java如何入门?学习教程要点是什么?如何精通?做好以下这些点,入门更快,掌握Java更轻松. Java必备基础知识 1.你需要精通面向对象分析与设计(OOA/OOD).涉及模式(GOF,J2EE ...
- Jboss as 服务器基本设置
http://www.cnblogs.com/lovingprince/archive/2009/09/03/2166307.html Step one: download JBoss Applica ...
- javascript解析器(引擎)
The JavaScript interpreter in a browser is implemented as a single thread. javascript 引擎在浏览器中作为单线程实现 ...
- android 屏幕适配原则
屏幕大小 1.不同的layout Android手 机屏幕大小不一,有480x320,640x360,800x480.怎样才能让App自动适应不同的屏幕呢? 其实很简单,只需要在res目录下创建不同的 ...
- Navicat Premium快速导出数据库ER图和数据字典
2.快速导出数据库数据字典: SQL Server 数据库,生成数据字典 use YourDatabase --指定要生成数据字典的数据库 go SELECT 表名= then d.name else ...
- God web
http://my.csdn.net/yerenyuan_pku http://evilcos.me/?p=336 https://www.zhihu.com/question/21606800 st ...
- python学习之logging模块
Logger.setLevel(level) 设置记录器的级别为level.低于该级别的信息将被忽略. 记录器默认级别为NOTSET.如果记录器是根记录器,则默认将记录所有信息: 如果是一个非根记录器 ...
- 把以逗号分隔的字符串转换成list
/** * 把省的字符串转换成列表 * * @param province * @return */ private List<String> getProvinceList(String ...