`
leonardleonard
  • 浏览: 801359 次
社区版块
存档分类
最新评论

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

阅读更多

 在开始之前,先熟悉几个类及部分属性、方法:CSharpCodeProviderICodeCompilerCompilerParametersCompilerResultsAssembly

  一、CSharpCodeProvider
    提供对C#代码生成器和代码编译器的实例的访问。如果要动态生成VB代码,可以使用VBCodeProvider

    CreateCompiler():获取编译器的实例。

  二、ICodeCompiler
    定义用于调用源代码编译的接口或使用指定编译器的CodeDOM树。每种编译方法都接受指示编译器的CompilerParameters对象,并返回指示编译结果的CompilerResults对象。

    CompilerAssemblyFromSource(CompilerParameters option, string source):使用指定的编译器,从包含源代码的字符串设置编译程序集。

  三、CompilerParameters
    
表示用于调用编译器的参数。

    ReferencedAssemblies:获取当前项目所引用的程序集。Add方法为程序集添加引用。
    GenerateExecutable:获取或设置一个值,该值指示是否生成可执行文件。若此属性为false,则生成DLL,默认是false。
    GenerateInMemory:获取或设置一个值,该值指示是否在内存中生成输出。

  四、CompilerResults
    表示从编译器返回的编译结果。

    CompiledAssembly:获取或设置以编译的程序集,Assembly类型。

  五、Assembly
    就是程序集了(不知道如何描述了)。

  大致了解了以上知识之后,就可以使用C#动态的编译并执行代码了,一下是一段示例程序:

  1. using System; 
  2. using System.Reflection; 
  3. using System.Globalization; 
  4. using Microsoft.CSharp;
  5. using System.CodeDom; 
  6. using System.CodeDom.Compiler;
  7. using System.Text; 
  8. namespace ConsoleApplication1 
  9. {
  10.     public class Program
  11.     {
  12.         static void Main(string[] args)
  13.         {
  14.             // 1.CSharpCodePrivoder
  15.             CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();
  16.             // 2.ICodeComplier
  17.             ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler();
  18.             // 3.CompilerParameters
  19.             CompilerParameters objCompilerParameters = new CompilerParameters();
  20.             objCompilerParameters.ReferencedAssemblies.Add("System.dll");
  21.             objCompilerParameters.GenerateExecutable = false;
  22.             objCompilerParameters.GenerateInMemory = true;
  23.             // 4.CompilerResults
  24.             CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, GenerateCode());
  25.             if (cr.Errors.HasErrors)
  26.             {
  27.                 Console.WriteLine("编译错误:");
  28.                 foreach (CompilerError err in cr.Errors)
  29.                 {
  30.                     Console.WriteLine(err.ErrorText);
  31.                 }
  32.             }
  33.             else
  34.             {
  35.                 // 通过反射,调用HelloWorld的实例
  36.                 Assembly objAssembly = cr.CompiledAssembly;
  37.                 object objHelloWorld = objAssembly.CreateInstance("DynamicCodeGenerate.HelloWorld");
  38.                 MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");
  39.                 Console.WriteLine(objMI.Invoke(objHelloWorld, null));
  40.             }
  41.             Console.ReadLine();
  42.         }
  43.         static string GenerateCode()
  44.         {
  45.             StringBuilder sb = new StringBuilder();
  46.             sb.Append("using System;");
  47.             sb.Append(Environment.NewLine);
  48.             sb.Append("namespace DynamicCodeGenerate");
  49.             sb.Append(Environment.NewLine);
  50.             sb.Append("{");
  51.             sb.Append(Environment.NewLine);
  52.             sb.Append("    public class HelloWorld");
  53.             sb.Append(Environment.NewLine);
  54.             sb.Append("    {");
  55.             sb.Append(Environment.NewLine);
  56.             sb.Append("        public string OutPut()");
  57.             sb.Append(Environment.NewLine);
  58.             sb.Append("        {");
  59.             sb.Append(Environment.NewLine);
  60.             sb.Append("             return \"Hello world!\";");
  61.             sb.Append(Environment.NewLine);
  62.             sb.Append("        }");
  63.             sb.Append(Environment.NewLine);
  64.             sb.Append("    }");
  65.             sb.Append(Environment.NewLine);
  66.             sb.Append("}");
  67.             string code = sb.ToString();
  68.             Console.WriteLine(code);
  69.             Console.WriteLine();
  70.             return code;
  71.         }
  72.     }
  73. }
分享到:
评论

相关推荐

    C# wpf 动态编译简单代码

    在C#编程环境中,WPF(Windows Presentation Foundation)是一种用于构建桌面应用程序的UI框架,而动态编译则是C#的一项强大功能,允许程序在运行时编译和执行代码。这篇教程将带你了解如何在WPF应用中实现动态编译...

    C#动态执行与编译

    2. 脚本引擎:游戏开发中,可以使用动态编译执行玩家自定义的脚本,增加游戏的可玩性和扩展性。 3. 动态生成SQL:在数据库操作中,可以根据条件动态构建SQL语句,提高代码的灵活性和性能。 总结来说,C#动态执行与...

    一个C#动态编译的源代码

    动态编译(又称运行时编译)允许我们编写代码并在程序运行过程中即时编译和执行这段代码,而不是在程序启动前预编译所有代码。这种技术在许多场景下都非常有用,例如在脚本环境中,或者当需要根据用户输入或特定条件...

    C# 动态编译文本框里的代码

    在C#编程环境中,动态编译是通过System.CodeDom....总之,C#的动态编译功能使得开发者能够在程序运行时编译和执行代码,极大地扩展了.NET应用程序的灵活性和功能性。但同时,也需要关注其潜在的安全风险和性能影响。

    c#动态生成源代码并编译

    动态生成源代码则打破了这一常规,它在运行时创建源代码字符串,并将其编译为可执行代码。 2. **System.CodeDom namespace** .NET框架提供了一个名为`System.CodeDom`的命名空间,包含了用于生成源代码的对象模型...

    c#动态编译生成

    总结来说,C#动态编译是通过`Microsoft.CSharp.CSharpCodeProvider`或Roslyn API实现的,它们允许我们根据需求在运行时生成、编译和执行代码。这对于实现灵活的代码生成、插件系统或自动化任务有着极大的价值。在`...

    C#动态编译

    下面是一个简单的示例,演示如何使用C#动态编译编译一个简单的源代码字符串: ```csharp using System; using System.CodeDom.Compiler; using Microsoft.CSharp; public class DynamicCompilationExample { ...

    c# 动态编译代码 执行脚本代码 关键字还会变色

    c# 动态编译代码 执行脚本代码 关键字还会变色 // debug it step by step (F10, F11) using System; // for Console.WriteLine using System.Windows.Forms; // for MessageBox.Show, ... using System....

    C# wpf 动态编译脚本

    总结来说,C# WPF动态编译脚本技术利用.NET框架提供的工具,能够在运行时编译和执行C#代码,这对于构建灵活、可扩展的应用程序非常有用。开发者需要理解如何构造CodeDom对象、设置编译参数以及安全地执行编译后的...

    C#动态脚本案例,动态编译执行代码

    在.NET框架中,C#是一种强大的编程语言,它允许开发者在运行时动态地创建和执行代码,这在处理不确定或需要灵活编程需求的场景中非常有用。本案例将深入探讨如何利用C#实现动态脚本编译和执行,以及相关的知识点。 ...

    C#代码动态编译、动态执行、动态调试[参照].pdf

    我们将介绍如何使用动态编译来生成动态代码,並且使用AppDomain来加载和卸载动态代码。同时,我们还将讨论如何使用动态调试来调试动态代码。 一、C#代码动态编译 在.NET框架中,我们可以使用CodeDOM来实现动态...

    c#动态读取代码并动态编译

    2. 自定义脚本:游戏引擎、自动化工具等可以使用动态编译来执行用户的脚本,这些脚本可以是C#或其他支持的语言。 3. AOP(面向切面编程):动态编译可以用于在编译时或运行时插入额外的代码,实现如日志记录、事务...

    c# 动态生成源代码并编译

    在.NET Core和.NET 5及更高版本中,通常推荐使用`AssemblyLoadContext`来加载动态生成的Assembly并执行代码。 5. **异常处理与错误报告** 在动态编译过程中,可能会遇到语法错误、类型引用错误等。Roslyn提供了...

    C#代码动态编译、动态执行、动态调试

    前几天看到一篇关于.net动态编译的文章 ...在此基础上我做了一些封装,为使调用更加简单,并增加了对动态代码调试的支持,相同代码只编译一次的支持,代码改动自动重新编译,代码引用文件的自动加载和手工加载等功能。 ...

    C#动态编译,可以编译TXT格式的文件形成C#文件

    在.NET框架中,C#语言提供了强大的动态编译能力,使得开发者可以在运行时将源代码字符串编译为可执行的程序集。这个过程通常涉及到System.CodeDom.Compiler命名空间中的类,如CodeDomProvider和CompilerResults等。...

    C# 动态编译

    在.NET框架中,C#语言提供了强大的动态编译能力,这使得我们可以在程序运行时根据需求编译和执行代码。动态编译的概念主要是基于System.CodeDom.Compiler命名空间中的类,如CodeDomProvider和CompilerParameters等。...

    使用 C# 动态编译代码和执行的代码

    代码如下: /* * 使用 C# 动态编译代码和执行 * 作者: yaob */ static void Main(string[] args) { // 编译器 CodeDomProvider cdp = CodeDomProvider.CreateProvider(“C#”); // 编译器的参数 CompilerParameters ...

    C#中动态编译应用程序C#源码

    通过掌握动态编译,你可以创建自定义的脚本系统,实现代码热更新,甚至在运行时根据需求生成和执行代码。不过,这也带来了一些安全风险,因为不安全的代码可能会在运行时被执行,因此在使用时应谨慎评估风险并采取...

    基于Roslyn的Natasha库动态执行C#脚本

    Natasha 是一个强大的 C# 开源库,它利用 Microsoft 的 Roslyn 编译框架来实现动态编译和执行 C# 代码。Roslyn 提供了一种现代化的 ...记住,使用动态编译时需谨慎处理潜在的安全风险,尤其是在处理用户输入的代码时。

Global site tag (gtag.js) - Google Analytics