C#动态执行代码

栏目: C# · 发布时间: 6年前

内容简介:一、CSharpCodeProvider提供对C#代码生成器和代码编译器的实例的访问。如果要动态生成VB代码,可以使用VBCodeProvider。CreateCompiler():获取编译器的实例。
编辑推荐:
本文来自于网络,熟悉几个类及部分属性、方法:CSharpCode Provider 、ICodeCompiler、CompilerParameters 、Compiler Results 、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

// 3.CompilerParameters

CompilerParameters objCompilerParameters = new CompilerParameters();

objCompilerParameters .ReferencedAssemblies.Add (" System .dll");

objCompilerParameters .GenerateExecutable = false;

objCompilerParameters .GenerateInMemory = true;

// 4.CompilerResults

CompilerResults cr = objICodeCompiler .CompileAssemblyFromSource (objCompiler Parameters , GenerateCode ());

if (cr.Errors .HasErrors)

{

Console.WriteLine ("编译错误:");

foreach (CompilerError err in cr.Errors)

{

Console.WriteLine (err.ErrorText);

}

}

else

{

// 通过反射,调用HelloWorld的实例

Assembly objAssembly = cr.CompiledAssembly;

objectobjHelloWorld = 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);

string code = sb.ToString();

Console.WriteLine (code);

Console.WriteLine();

return code;

}

}

}


以上所述就是小编给大家介绍的《C#动态执行代码》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Reality Is Broken

Reality Is Broken

Jane McGonigal / Penguin Press HC, The / 2011-1-20 / USD 26.95

Visionary game designer Jane McGonigal reveals how we can harness the power of games to solve real-world problems and boost global happiness. More than 174 million Americans are gamers, and......一起来看看 《Reality Is Broken》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器