`
jiasongmao
  • 浏览: 676273 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

动态编译执行c#代码

阅读更多

注:该文章内容非本人撰写,转载于:http://hi.baidu.com/%BE%FD%D0%D0%BD%A1/blog/item/acf943b3acce92a6d8335af0.html和CSDN--->http://blog.csdn.net/begtostudy/archive/2009/01/28/3853956.aspx

 

在开始之前,先熟悉几个类及部分属性、方法: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
    就是程序集了(不知道如何描述了)。

 

下面为两个实例代码:

 

Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider();
            System.CodeDom.Compiler.ICodeCompiler comp = provider.CreateCompiler();
            System.CodeDom.Compiler.CompilerParameters cp = new System.CodeDom.Compiler.CompilerParameters();
            cp.ReferencedAssemblies.Add("system.dll") ;
            cp.ReferencedAssemblies.Add("system.data.dll") ;
            cp.ReferencedAssemblies.Add("system.xml.dll") ;
            cp.GenerateExecutable = false ;
            cp.GenerateInMemory = true ;
            string code = @"using System;
                            using System.Data;   
                            using System.Xml;      
                            public class Judgement
                            {        
                                 public object GetJude()
                                 {   
                                      return (" + expression + @");   
                                 }   
                            }" ;
            System.CodeDom.Compiler.CompilerResults cr = comp.CompileAssemblyFromSource(cp,code);
            System.Diagnostics.Debug.Write(code);
            if(cr.Errors.HasErrors)
            {
                System.Text.StringBuilder errorMsg = new System.Text.StringBuilder();
              
                foreach(System.CodeDom.Compiler.CompilerError err in cr.Errors)
                {
                    errorMsg.Append(err.ErrorText );
                }
                System.Diagnostics.Debug.WriteLine(errorMsg.ToString());
              
                throw new System.Exception("编译错误: " + errorMsg.ToString());
                //return false;
            }
            else
            {
                System.Reflection.Assembly tmp = cr.CompiledAssembly;
                object _Compiled = tmp.CreateInstance("Judgement");
                System.Reflection.MethodInfo mi = _Compiled.GetType().GetMethod("GetJude");
               
                return mi.Invoke(_Compiled,null);
            }

 

 

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

相关推荐

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

    这个类提供了对C#代码生成器和代码编译器实例的访问。如果想要动态生成Visual Basic代码,则可以使用`VBCodeProvider`类。 - **CreateCompiler()**:该方法用于获取编译器的实例。 #### ICodeCompiler 定义了一个...

    C# wpf 动态编译简单代码

    以下是一个简单的示例,演示如何在WPF应用中动态编译C#代码: ```csharp using System; using System.CodeDom.Compiler; using Microsoft.CSharp; public void DynamicCompile(string sourceCode) { // 创建C#...

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

    C#代码动态编译、动态执行、动态调试 在本文中,我们讨论了C#代码的动态编译、动态执行和动态调试。我们将介绍如何使用动态编译来生成动态代码,並且使用AppDomain来加载和卸载动态代码。同时,我们还将讨论如何...

    C#动态执行与编译

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

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

    这通常涉及到System.CodeDom.Compiler命名空间,其中包含的类如CodeDomProvider和CompilerResults可以帮助我们在运行时编译C#代码。对于那些关心源代码安全的用户,动态编译可以提供一种方法,使得源代码不直接暴露...

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

    Natasha 是一个强大的 C# 开源库,它利用 Microsoft 的 Roslyn 编译框架来实现动态编译和执行 C# 代码。Roslyn 提供了一种现代化的 API,允许开发者在运行时对 C# 代码进行分析、修改和生成。Natasha 在此基础上...

    C# wpf 动态编译脚本

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

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

    例如,我们可以使用CSharpCodeProvider创建一个代码提供者,然后将字符串形式的C#代码传入,编译成一个Assembly。 三、Roslyn编译API 微软的Roslyn项目为C#和VB.NET提供了开源的编译器API,这使得动态编译变得更加...

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

    在C#编程环境中,动态编译是通过System.CodeDom.Compiler命名空间提供的类来实现的,这使得我们可以在程序运行时动态地创建、编译和执行源代码。这种能力对于构建小型编译器或者代码解释器非常有用,尤其适用于需要...

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

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

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

    这项技术允许开发者在程序运行时创建和编译新的C#代码,使得程序具有更强的灵活性和适应性。下面将详细介绍这个过程涉及的关键知识点。 1. **C#语法与编译原理** C#是一种强类型、面向对象的语言,它的编译过程...

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

    3. **动态编译**:在C#中,我们可以使用`AppDomain`的`CreateInstanceAndUnwrap`方法来实例化由动态编译得到的类型,从而执行动态生成的代码。以下是一个简单的例子: ```csharp var provider = new ...

    动态编译 DynamicCompiler c#

    动态编译是编程领域中的一个重要概念,特别是在C#这样的高级编程语言中,它允许开发者在程序运行时生成、编译和执行代码。这种能力极大地提高了灵活性和效率,尤其是在处理复杂逻辑或者需要根据运行时环境调整行为的...

    c#动态编译生成

    `ConsoleApplication1`可能是一个简单的控制台应用,演示了如何在运行时动态编译和执行C#代码。在这个项目中,你可能会看到如何将上述两种方法整合到实际的项目中,比如读取用户输入的C#代码,然后使用动态编译来...

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

    3. **创建CodeDomProvider实例**:通过new CSharpCodeProvider()实例化CSharpCodeProvider,它是用于编译C#代码的提供商。 4. **编写源代码**:创建CodeCompileUnit,将TXT文件中的C#代码组织成CodeNamespace和...

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

    在C#编程环境中,动态编译应用程序是一种高级技术,它允许开发者在运行时根据需要编译C#源代码。这通常用于实现自定义脚本引擎、动态加载功能或执行特定任务,而无需重新构建整个项目。本文将深入探讨C#中动态编译...

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

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

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

    《C#代码动态编译、动态执行与动态调试详解》 C#编程语言为我们提供了强大的动态编译、执行和调试能力,这对于开发人员在运行时调整和优化代码提供了极大的便利。本文将深入探讨如何利用C#实现这些功能,以及如何...

    C#动态编译

    例如,我们可以使用`CSharpCodeProvider`类创建一个C#代码提供者,然后使用`CompileAssemblyFromSource`或`CompileAssemblyFromFile`方法编译源代码或源文件。 下面是一个简单的示例,演示如何使用C#动态编译编译一...

    c#动态执行字符串事例

    在.NET框架中,C#程序员有时需要在运行时动态地执行代码字符串,这通常涉及到`System.CodeDom`命名空间中的类。`CodeDom`提供了一种编译和执行字符串代码的方法,而无需直接使用`eval`函数,如JavaScript中常见的...

Global site tag (gtag.js) - Google Analytics