在开始之前,先熟悉几个类及部分属性、方法: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)
- {
-
- CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();
-
- ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler();
-
- CompilerParameters objCompilerParameters = new CompilerParameters();
- objCompilerParameters.ReferencedAssemblies.Add("System.dll");
- objCompilerParameters.GenerateExecutable = false;
- objCompilerParameters.GenerateInMemory = true;
-
- CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, GenerateCode());
- if (cr.Errors.HasErrors)
- {
- Console.WriteLine("编译错误:");
- foreach (CompilerError err in cr.Errors)
- {
- Console.WriteLine(err.ErrorText);
- }
- }
- else
- {
-
- 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;
- }
- }
- }
分享到:
相关推荐
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# 动态编译代码和执行 * 作者: yaob */ static void Main(string[] args) { // 编译器 CodeDomProvider cdp = CodeDomProvider.CreateProvider(“C#”); // 编译器的参数 CompilerParameters ...
前几天看到一篇关于.net动态编译的文章 ...在此基础上我做了一些封装,为使调用更加简单,并增加了对动态代码调试的支持,相同代码只编译一次的支持,代码改动自动重新编译,代码引用文件的自动加载和手工加载等功能。 ...
C# 反编译工具ILSpy,非常经典实用的C#代码反编译工具,可以将执行文件反编译成原始代码,也可将dll反编译成原始代码
Reflector的出现使.NET程序员眼前豁然开朗,因为这个免费工具可以将.NET程序集中的中间语言反编译成C#或者Visual Basic代码。除了能将IL转换为C#或Visual Basic以外,Reflector还能够提供程序集中类及其成员的概要...
C#代码动态编译、动态执行、动态调试[参照].pdf
在此基础上我做了一些封装,为使调用更加简单,并增加了对动态代码调试的支持,相同代码只编译一次的支持,代码改动自动重新编译,代码引用文件的自动加载和手工加载等功能。 如上图,我封装的类CSharpProvider很...
如果要动态生成VB代码,可以使用VBCodeProvider。CreateCompiler():获取编译器的实例。定义用于调用源代码编译的接口或使用指定编译器的CodeDOM树。每种编译方法都接受指示编译器的CompilerParameters对象,并返回...
C#动态加载代码,编译,执行,提供实例源码,仅供学习参考。
项目中涉及到Asp.Net扩展性,考虑了两种扩展方法,一种是使用Web Services实现,另一... 使用插件机制来扩展B/S程序,主要需要实现两个功能,首先是动态编译插件中的C#代码,然后利用反射来执行插件已经编译的C#代码。
一款从老师那里弄来的可以看见源代码的(c#)反编译工具
代码的动态编译并执行是.NET平台提供给我们的很强大的一个工具,用以灵活扩展(当然是面对内部开发人员)复杂而无法估算的逻辑,并通过一些额外的代码来扩展我们已有 的应用程序。这在很大程度上给我们提供了另外一...
C#是一种编译型的语言,程序执行,首先要经过编译器编译,如何让C#像一种脚本一样,在要执行的时候,进行编译,这里,我们可以用Microsoft.CSharp空间下的CSharpCodeProvider提供类,来达到动态编译的效果。...
C# Roslyn,Natasha动态代码编译生成程序集、动态编译到内存执行。 NatashaInitializer.Preheating(); string pname = "EmpName"; Employee employee = CreateObject(pname, "刘新华"); var action = NDelegate....
C#源代码,c源代码经过几次编译变成可执行文件,C#源码.zip