• C#的动态编译执行


    在运行时编写代码并编译执行。如下所示。

    Open按钮打开任意文本文件,并载入到TextBox。载入后可更改。

    Compile按钮进行编译和执行。具体代码如下。

    代码
    1 using System;
    2  using System.Windows.Forms;
    3  using System.IO;
    4  using System.CodeDom.Compiler;
    5  using Microsoft.CSharp;
    6  using System.Reflection;
    7
    8  namespace DynamicCodeCompiler
    9 {
    10 public partial class Form1 : Form
    11 {
    12 string dynammicCode;
    13
    14 public Form1()
    15 {
    16 InitializeComponent();
    17 }
    18
    19 //打开文件并载入代码
    20 private void button1_Click(object sender, EventArgs e)
    21 {
    22 OpenFileDialog ofd = new OpenFileDialog();
    23 ofd.Multiselect = false;
    24
    25 if (ofd.ShowDialog()==DialogResult.OK)
    26 {
    27 FileStream fs = new FileStream(ofd.FileName,FileMode.Open);
    28 StreamReader sr = new StreamReader(fs);
    29 dynammicCode = sr.ReadToEnd();
    30 textBox1.Text = dynammicCode;
    31 }
    32 }
    33
    34 private void button2_Click(object sender, EventArgs e)
    35 {
    36 if (textBox1.Text != null)
    37 {
    38 // 1.CSharpCodePrivoder
    39 CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();
    40
    41 // 2.ICodeComplier
    42 ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler();
    43
    44 // 3.CompilerParameters
    45 CompilerParameters objCompilerParameters = new CompilerParameters();
    46
    47 //此处添加引用,使用的代码必须在此处有引用否则会编译错误
    48 objCompilerParameters.ReferencedAssemblies.Add("System.dll");
    49 objCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
    50 objCompilerParameters.GenerateExecutable = false;
    51 objCompilerParameters.GenerateInMemory = true;
    52
    53 // 4.CompilerResults
    54 CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, textBox1.Text);
    55
    56 if (cr.Errors.HasErrors)
    57 {
    58 Console.WriteLine("编译错误:");
    59 foreach (CompilerError err in cr.Errors)
    60 {
    61 Console.WriteLine(err.ErrorText);
    62 }
    63 }
    64 else
    65 {
    66 // 通过反射,调用HelloWorld的实例。此处命名空间和类硬编码为Test.Program。
    67 Assembly objAssembly = cr.CompiledAssembly;
    68 object objDynamicAssenmbly = objAssembly.CreateInstance("Test.Program");
    69 MethodInfo objMI = objDynamicAssenmbly.GetType().GetMethod("Main");
    70
    71 //Console.WriteLine(objMI.Invoke(objDynamicAssenmbly, null));
    72 objMI.Invoke(objDynamicAssenmbly, null);
    73 }
    74
    75 }
    76 }
    77 }
    78 }
    79
  • 相关阅读:
    P1005 矩阵取数
    [BZOJ2662][BeiJing wc2012]冻结
    [BZOJ1191]超级英雄Hero
    [bzoj1008] 越狱
    [bzoj1001]狼抓兔子 最小割
    网络流24题——负载平衡问题
    分形小山
    可并堆——左偏树、斜堆
    NOIP最优贸易
    洛谷P2073送花
  • 原文地址:https://www.cnblogs.com/kidfruit/p/1753431.html
Copyright © 2020-2023  润新知