C#动态编译并执行代码

先来张运行时截图:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;

namespace CSharpDynamicCode
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnRun_Click(object sender, EventArgs e)
        {
            run();
        }

        void run()
        {
            CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();
            ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler();

            CompilerParameters objCompilerParameters = new CompilerParameters();

            //添加需要引用的dll
            objCompilerParameters.ReferencedAssemblies.Add("System.dll");
            objCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");

            //是否生成可执行文件
            objCompilerParameters.GenerateExecutable = false;

            //是否生成在内存中
            objCompilerParameters.GenerateInMemory = true;

            //编译代码
            CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, txtCode.Text);

            if (cr.Errors.HasErrors)
            {
                var msg = string.Join(Environment.NewLine, cr.Errors.Cast<CompilerError>().Select(err => err.ErrorText));
                MessageBox.Show(msg, "编译错误");
            }
            else
            {
                Assembly objAssembly = cr.CompiledAssembly;
                object objHelloWorld = objAssembly.CreateInstance("Test");
                MethodInfo objMI = objHelloWorld.GetType().GetMethod("Hello");
                objMI.Invoke(objHelloWorld, null);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

https://www.cnblogs.com/nanfei/p/6046128.html

/// <summary>
        /// 动态编译并执行代码
        /// </summary>
        /// <param name="code">代码</param>
        /// <param name="newPath">输出dll的路径</param>
        /// <returns>返回输出内容</returns>
        private CompilerResults debugRun(string[] code, string newPath)
        {
            CSharpCodeProvider complier = new CSharpCodeProvider();
            //设置编译参数
            CompilerParameters paras = new CompilerParameters();
            //引入第三方dll
            paras.ReferencedAssemblies.Add(@"System.dll");
            paras.ReferencedAssemblies.Add(@"System.configuration.dll");
            paras.ReferencedAssemblies.Add(@"System.Data.dll");
            paras.ReferencedAssemblies.Add(@"System.Management.dll");
            paras.ReferencedAssemblies.Add(@"System.Web.dll");
            paras.ReferencedAssemblies.Add(@"System.Xml.dll");
            paras.ReferencedAssemblies.Add(@"F:\AuthorizationService\Lib\Newtonsoft.Json\Net20\Newtonsoft.Json.dll");
            //引入自定义dll
            //paras.ReferencedAssemblies.Add(@"D:\自定义方法\自定义方法\bin\LogHelper.dll");
            //是否内存中生成输出
            paras.GenerateInMemory = false;
            //是否生成可执行文件
            paras.GenerateExecutable = false;
            paras.OutputAssembly = newPath;

            //编译代码
            CompilerResults result = complier.CompileAssemblyFromSource(paras, code);

            return result;
        }

http://www.cnblogs.com/feigao/p/6197167.html

原文地址:https://www.cnblogs.com/chuancheng/p/8444566.html

时间: 2024-10-10 06:23:37

C#动态编译并执行代码的相关文章

如何用C#动态编译、执行代码

原文:如何用C#动态编译.执行代码 在开始之前,先熟悉几个类及部分属性.方法:CSharpCodeProvider.ICodeCompiler.CompilerParameters.CompilerResults.Assembly. 一.CSharpCodeProvider 提供对C#代码生成器和代码编译器的实例的访问.如果要动态生成VB代码,可以使用VBCodeProvider. CreateCompiler():获取编译器的实例. 二.ICodeCompiler 定义用于调用源代码编译的接口

使用Roslyn动态编译和执行

1. 安装nuget package 2.使用Roslyn 动态执行 var engine = newRoslyn.Scripting.CSharp.ScriptEngine(); engine.CreateSession().Execute ("System.Console.WriteLine(\"Hello , Roslyn .\");"); 3.使用Roslyn 动态编译 var engine = newRoslyn.Scripting.CSharp.Scri

JDK8中Java调用Javascript脚本引擎动态定义与执行代码

import java.lang.*; import java.util.Arrays; import java.util.List; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; public class ScriptEngineTest { public static void main(String[] args) throw

让C#语言充当自身脚本!——.NET中的动态编译

原文:让C#语言充当自身脚本!--.NET中的动态编译 代码的动态编译并执行是.NET平台提供给我们的很强大的一个工具,用以灵活扩展(当然是面对内部开发人员)复杂而无法估算的逻辑,并通过一些额外的代码来扩展我们已有 的应用程序.这在很大程度上给我们提供了另外一种扩展的方式(当然这并不能算是严格意义上的扩展,但至少为我们提供了一种思路). 动态代码执行可以应用在诸如模板生成,外加逻辑扩展等一些场合.一个简单的例子,为了网站那的响应速度,HTML静态页面往往是我们最好的选择,但基于数据驱动的网站往往

.NET中的动态编译

http://www.cnblogs.com/zlgcool/archive/2008/10/12/1309616.html 在开始之前,先熟悉几个类及部分属性.方法:CSharpCodeProvider.ICodeCompiler.CompilerParameters.CompilerResults.Assembly. 一.CSharpCodeProvider 提供对C#代码生成器和代码编译器的实例的访问.如果要动态生成VB代码,可以使用VBCodeProvider. CreateCompil

程序动态编译代码

c#可以在程序运行过程中动态的编译代码,并生成程序集加载在内存,然后就可以动态的调用代码生成的程序了,这有点像我们的vs编译器,感兴趣的可以制作属于自己的c#编译器: 要实现这种功能,我们只需要调用CSharpCodeProvider就可以实现了: string prefix = "using System;"+ "public static class Test{"+ "public static void Run(){"; string po

Lua 学习笔记(七)编译、执行外部代码块

Lua称为解释型语言的原因:Lua允许在运行源代码之前,先将源代码预编译为一种中间形式.区别解释型语言的主要特征是在于编译器是否是语言运行时库的一部分,即有能力执行动态生成的代码.因为Lua中有dofile函数,才可以将Lua成为一种解释型的语言. 运行Lua代码块有三种形式: 1.dofile 直接编译运行Lua外部代码块,并不返回任何结果. 2.loadfile 编译Lua外部代码块,但不会运行代码,将会以函数的形式返回编译结果. 3.loadstring 编译字符串中的代码,而非从文件读取

C#执行js动态编译的方法

本文实例讲述了C#执行js动态编译的方法.分享给大家供大家参考.具体实现方法如下: 代码如下: using System; using System.CodeDom.Compiler; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace webpro { public clas

Java代码编译和执行的整个过程

Java代码编译是由Java源码编译器来完成,流程图如下所示: Java字节码的执行是由JVM执行引擎来完成,流程图如下所示: Java代码编译和执行的整个过程包含了以下三个重要的机制: Java源码编译机制 类加载机制 类执行机制 Java源码编译机制 Java 源码编译由以下三个过程组成: 分析和输入到符号表 注解处理 语义分析和生成class文件 流程图如下所示: 最后生成的class文件由以下部分组成: 结构信息.包括class文件格式版本号及各部分的数量与大小的信息 元数据.对应于Ja