在开始之前,先熟悉几个类及部分属性、方法:CSharpCodeProvider、ICodeCompiler、CompilerParameters、CompilerResults、Assembly。
一、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#动态编译与执行代码之前,首先需要理解几个关键的类及其属性和方法:`CSharpCodeProvider`、`ICodeCompiler`、`CompilerParameters`、`CompilerResults`以及`...
在C#编程环境中,WPF(Windows Presentation Foundation)是一种用于构建桌面应用程序的UI框架,而动态编译则是C#的一项强大功能,允许程序在运行时编译和执行代码。这篇教程将带你了解如何在WPF应用中实现动态编译...
5. **动态执行编译后的代码**:编译成功后,`CompilerResults`对象的`CompiledAssembly`属性包含了生成的程序集。可以通过反射(Reflection)来创建并执行该程序集中的类型和方法。 在WPF应用中,动态编译脚本通常...
C#的动态编译功能主要依赖于Microsoft.CSharp命名空间中的CSharpCodeProvider类,它是一个实现了ICodeCompiler接口的类,能够将C#源代码编译成.NET中间语言(IL)。 在压缩包文件中,我们可以看到以下文件: 1. ...
在C#编程环境中,动态编译是通过System.CodeDom.Compiler命名空间提供的类来实现的,这使得我们可以在程序运行时动态地创建、编译和执行源代码。这种能力对于构建小型编译器或者代码解释器非常有用,尤其适用于需要...
在C#编程中,动态生成源代码并进行编译是一项高级技术,主要应用于运行时代码扩展、元编程或自定义脚本执行等场景。这项技术允许开发者在程序运行时创建和编译新的C#代码,使得程序具有更强的灵活性和适应性。下面将...
总结来说,C#动态编译是通过`Microsoft.CSharp.CSharpCodeProvider`或Roslyn API实现的,它们允许我们根据需求在运行时生成、编译和执行代码。这对于实现灵活的代码生成、插件系统或自动化任务有着极大的价值。在`...
CSharpCodeProvider是.NET提供的一个接口,它允许我们使用C#语言进行代码的动态编译。 下面是一个简单的步骤概述: 1. **读取TXT文件**:使用StreamReader或其他文件读取方法读取TXT文件内容,将其转化为字符串...
通过使用`CodeCompileUnit`,`CodeNamespace`,`CodeTypeDeclaration`等类,我们可以构建源代码的结构,然后用`CSharpCodeProvider`进行编译。 2. **CSharpCodeProvider**:这个类是.NET框架的一部分,负责提供C#...
例如,我们可以使用`CSharpCodeProvider`类创建一个C#代码提供者,然后使用`CompileAssemblyFromSource`或`CompileAssemblyFromFile`方法编译源代码或源文件。 下面是一个简单的示例,演示如何使用C#动态编译编译一...
在.NET框架中,C#提供了一种强大的能力,即能够在运行时动态地读取、编译和执行代码。这种功能通常被称为动态编译,对于快速迭代开发、插件架构、自定义脚本执行等场景非常有用。动态编译能够极大地提高开发效率,...
在C#编程中,动态生成源代码并进行编译是一项重要的技术,特别是在元编程、插件系统或自动化脚本编写等场景中。这项技术允许我们在程序运行时创建、修改和执行新的代码,增加了代码的灵活性和扩展性。下面将详细阐述...
在C#编程环境中,动态编译应用程序是一种高级技术,它允许开发者在运行时根据需要编译C#源代码。这通常用于实现自定义脚本引擎、动态加载功能或执行特定任务,而无需重新构建整个项目。本文将深入探讨C#中动态编译...
在.NET框架中,C#程序员有时需要在运行时动态地执行...这就是使用`C#`和`CodeDom`实现动态执行字符串的基本流程。在实际项目中,你可以根据需要扩展这个功能,比如处理更复杂的代码逻辑、捕获执行结果、参数传递等。
在C#编程中,有时我们需要在运行时动态地编译和执行代码,这通常涉及到反射、编译器服务和类型创建。本示例展示了如何在C#中动态编译一个包含简单方法的字符串,并调用该方法。这个过程通常用于在程序运行时根据用户...
《C#代码动态编译、动态执行与动态调试详解》 C#编程语言为我们提供了强大的动态编译、执行和调试能力,这对于开发人员在运行时调整和优化代码提供了极大的便利。本文将深入探讨如何利用C#实现这些功能,以及如何...
本示例中的“C# 实现 动态生成.EXE 程序和源码”是一个关于利用C#编程语言动态编译和生成可执行文件(.EXE)的过程,这涉及到对.NET编译器工作原理的理解和运用。 首先,我们需要了解.NET编译器的工作流程。C#源...
C#动态编译是.NET框架提供的一种强大功能,它允许我们在程序运行时编译和执行代码。这种技术在很多场景下都非常有用,比如在插件系统、代码自动生成或者需要根据用户输入执行特定代码的场景。C#动态编译主要通过...
C#动态执行代码是.NET框架提供的一种强大功能,允许开发者在程序运行时生成、编译和执行代码。这种能力在很多场景下非常有用,比如在元编程、脚本引擎、自定义编译策略或者需要根据运行时条件动态改变程序行为的应用...
在C#编程中,动态加载代码是一项非常实用的技术,它允许程序在运行时根据需要加载、编译和执行未知或动态生成的代码。这在处理插件系统、元编程、自定义扩展等场景中尤为常见。本文将深入探讨C#中的动态加载代码,并...