C#動態編譯、執行代碼

來源:互聯網
上載者:User
C#動態編譯、執行代碼
Compiling and Running code at runtime

.NET Framework 提供了使您以編程方式訪問 C# 語言編譯器的類。 這使我們能編寫自己的代碼編譯公用程式。
本文提供了範例程式碼,示範了如何使用C#在運行時動態編譯,執行代碼。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.CodeDom.Compiler;
  5. using System.IO;
  6. using Microsoft.CSharp;
  7. using System.Reflection;

  8. namespace DynaCode
  9. {
  10.     class Program
  11.     {
  12.         static string[] code = {
  13.             "using System;"+
  14.             "namespace DynaCode"+
  15.             "{"+
  16.             "   public class HelloWorld"+
  17.             "   {"+
  18.             "       static public int Main(string str)"+
  19.             "       {"+
  20.             "           return str.Length;"+
  21.             "       }"+
  22.             "   }"+
  23.             "}"};

  24.         static void Main(string[] args)
  25.         {
  26.             CompileAndRun(code);
  27.             Console.ReadKey();
  28.         }

  29.         static void CompileAndRun(string[] code)
  30.         {
  31.             //通過使用 CompilerParameters 類,會將參數傳遞給編譯器
  32.             CompilerParameters CompilerParams = new CompilerParameters();
  33.             string outputDirectory = Directory.GetCurrentDirectory();

  34.             CompilerParams.GenerateInMemory = true;
  35.             CompilerParams.TreatWarningsAsErrors = false;
  36.             CompilerParams.GenerateExecutable = false;
  37.             CompilerParams.CompilerOptions = "/optimize";

  38.             string[] references = { "System.dll" };
  39.             CompilerParams.ReferencedAssemblies.AddRange(references);
  40.            
  41.             //CSharpCodeProvider提供在C# 代碼產生器和代碼編譯器的執行個體的訪問
  42.             CSharpCodeProvider provider = new CSharpCodeProvider();

  43.             //CompileAssemblyFromSource使用指定的編譯器,從包含原始碼的字串設定編譯器集
  44.             CompilerResults compile = provider.CompileAssemblyFromSource(CompilerParams, code);

  45.             if (compile.Errors.HasErrors)
  46.             {
  47.                 string text = "Compile error: ";
  48.                 foreach (CompilerError ce in compile.Errors)
  49.                 {
  50.                     text += "rn" + ce.ToString();
  51.                 }
  52.                 throw new Exception(text);
  53.             }

  54.         
  55.             //ExpoloreAssembly(compile.CompiledAssembly);
  56.             Module module = compile.CompiledAssembly.GetModules()[0];
  57.             Type mt = null;
  58.             MethodInfo methInfo = null;
  59.             if (module != null)
  60.             {
  61.                 mt = module.GetType("DynaCode.HelloWorld");
  62.             }
  63.             if (mt != null)
  64.             {
  65.                 methInfo = mt.GetMethod("Main");
  66.             }
  67.             if (methInfo != null)
  68.             {
  69.                 Console.WriteLine(methInfo.Invoke(null, new object[] { "here in dyna code" }));
  70.             }
  71.         }

  72.         static void ExpoloreAssembly(Assembly assembly)
  73.         {
  74.             Console.WriteLine("Modules in the assembly:");
  75.             foreach (Module m in assembly.GetModules())
  76.             {
  77.                 Console.WriteLine("{0}", m);
  78.                 foreach (Type t in m.GetTypes())
  79.                 {
  80.                     Console.WriteLine("t{0}", t.Name);
  81.                     foreach (MethodInfo mi in t.GetMethods())
  82.                     {
  83.                         Console.WriteLine("tt{0}", mi.Name);
  84.                     }
  85.                 }
  86.             }
  87.         }
  88.     }
  89. }

Dynamically Compiling C#
Dynamically executing code in .Net.

How to programmatically compile code using C# compiler

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.