`
wyf
  • 浏览: 437957 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
社区版块
存档分类
最新评论

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

    博客分类:
  • 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#动态的编译并执行代码了,一下是一段示例程序:

using System; 
using System.Reflection; 
using System.Globalization; 
using Microsoft.CSharp;
using System.CodeDom; 
using System.CodeDom.Compiler;
using System.Text; 

namespace ConsoleApplication1 
{
    public class Program
    {
        static void Main(string[] args)
        {
            // 1.CSharpCodePrivoder
            CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();

            // 2.ICodeComplier
            ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler();

            // 3.CompilerParameters
            CompilerParameters objCompilerParameters = new CompilerParameters();
            objCompilerParameters.ReferencedAssemblies.Add("System.dll");
            objCompilerParameters.GenerateExecutable = false;
            objCompilerParameters.GenerateInMemory = true;

            // 4.CompilerResults
            CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, GenerateCode());

            if (cr.Errors.HasErrors)
            {
                Console.WriteLine("编译错误:");
                foreach (CompilerError err in cr.Errors)
                {
                    Console.WriteLine(err.ErrorText);
                }
            }
            else
            {
                // 通过反射,调用HelloWorld的实例
                Assembly objAssembly = cr.CompiledAssembly;
                object objHelloWorld = objAssembly.CreateInstance("DynamicCodeGenerate.HelloWorld");
                MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");

                Console.WriteLine(objMI.Invoke(objHelloWorld, null));
            }

            Console.ReadLine();
        }

        static string GenerateCode()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("using System;");
            sb.Append(Environment.NewLine);
            sb.Append("namespace DynamicCodeGenerate");
            sb.Append(Environment.NewLine);
            sb.Append("{");
            sb.Append(Environment.NewLine);
            sb.Append("    public class HelloWorld");
            sb.Append(Environment.NewLine);
            sb.Append("    {");
            sb.Append(Environment.NewLine);
            sb.Append("        public string OutPut()");
            sb.Append(Environment.NewLine);
            sb.Append("        {");
            sb.Append(Environment.NewLine);
            sb.Append("             return \"Hello world!\";");
            sb.Append(Environment.NewLine);
            sb.Append("        }");
            sb.Append(Environment.NewLine);
            sb.Append("    }");
            sb.Append(Environment.NewLine);
            sb.Append("}");

            string code = sb.ToString();
            Console.WriteLine(code);
            Console.WriteLine();

            return code;
        }
    }
}

 感谢:  http://www.cnblogs.com/jailu/archive/2007/07/22/827058.html

分享到:
评论

相关推荐

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

    ### 如何用C#动态编译、执行代码 在探讨如何使用C#动态编译与执行代码之前,首先需要理解几个关键的类及其属性和方法:`CSharpCodeProvider`、`ICodeCompiler`、`CompilerParameters`、`CompilerResults`以及`...

    C# wpf 动态编译简单代码

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

    C# wpf 动态编译脚本

    5. **动态执行编译后的代码**:编译成功后,`CompilerResults`对象的`CompiledAssembly`属性包含了生成的程序集。可以通过反射(Reflection)来创建并执行该程序集中的类型和方法。 在WPF应用中,动态编译脚本通常...

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

    C#的动态编译功能主要依赖于Microsoft.CSharp命名空间中的CSharpCodeProvider类,它是一个实现了ICodeCompiler接口的类,能够将C#源代码编译成.NET中间语言(IL)。 在压缩包文件中,我们可以看到以下文件: 1. ...

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

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

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

    在C#编程中,动态生成源代码并进行编译是一项高级技术,主要应用于运行时代码扩展、元编程或自定义脚本执行等场景。这项技术允许开发者在程序运行时创建和编译新的C#代码,使得程序具有更强的灵活性和适应性。下面将...

    c#动态编译生成

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

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

    CSharpCodeProvider是.NET提供的一个接口,它允许我们使用C#语言进行代码的动态编译。 下面是一个简单的步骤概述: 1. **读取TXT文件**:使用StreamReader或其他文件读取方法读取TXT文件内容,将其转化为字符串...

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

    通过使用`CodeCompileUnit`,`CodeNamespace`,`CodeTypeDeclaration`等类,我们可以构建源代码的结构,然后用`CSharpCodeProvider`进行编译。 2. **CSharpCodeProvider**:这个类是.NET框架的一部分,负责提供C#...

    C#动态编译

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

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

    在.NET框架中,C#提供了一种强大的能力,即能够在运行时动态地读取、编译和执行代码。这种功能通常被称为动态编译,对于快速迭代开发、插件架构、自定义脚本执行等场景非常有用。动态编译能够极大地提高开发效率,...

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

    在C#编程中,动态生成源代码并进行编译是一项重要的技术,特别是在元编程、插件系统或自动化脚本编写等场景中。这项技术允许我们在程序运行时创建、修改和执行新的代码,增加了代码的灵活性和扩展性。下面将详细阐述...

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

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

    c#动态执行字符串事例

    在.NET框架中,C#程序员有时需要在运行时动态地执行...这就是使用`C#`和`CodeDom`实现动态执行字符串的基本流程。在实际项目中,你可以根据需要扩展这个功能,比如处理更复杂的代码逻辑、捕获执行结果、参数传递等。

    C#动态编译并执行字符串样例

    在C#编程中,有时我们需要在运行时动态地编译和执行代码,这通常涉及到反射、编译器服务和类型创建。本示例展示了如何在C#中动态编译一个包含简单方法的字符串,并调用该方法。这个过程通常用于在程序运行时根据用户...

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

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

    C# 实现 动态生成.EXE 程序和源码。

    本示例中的“C# 实现 动态生成.EXE 程序和源码”是一个关于利用C#编程语言动态编译和生成可执行文件(.EXE)的过程,这涉及到对.NET编译器工作原理的理解和运用。 首先,我们需要了解.NET编译器的工作流程。C#源...

    c#动态编译

    C#动态编译是.NET框架提供的一种强大功能,它允许我们在程序运行时编译和执行代码。这种技术在很多场景下都非常有用,比如在插件系统、代码自动生成或者需要根据用户输入执行特定代码的场景。C#动态编译主要通过...

    C#动态执行代码

    C#动态执行代码是.NET框架提供的一种强大功能,允许开发者在程序运行时生成、编译和执行代码。这种能力在很多场景下非常有用,比如在元编程、脚本引擎、自定义编译策略或者需要根据运行时条件动态改变程序行为的应用...

    C#动态加载代码的实例源码

    在C#编程中,动态加载代码是一项非常实用的技术,它允许程序在运行时根据需要加载、编译和执行未知或动态生成的代码。这在处理插件系统、元编程、自定义扩展等场景中尤为常见。本文将深入探讨C#中的动态加载代码,并...

Global site tag (gtag.js) - Google Analytics