注:该文章内容非本人撰写,转载于: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
在开始之前,先熟悉几个类及部分属性、方法: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
就是程序集了(不知道如何描述了)。
下面为两个实例代码:
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#代码生成器和代码编译器的实例的访问。如果要动态生成VB代码,可以使用VBCodeProvider。 CreateCompiler():获取编译器的实例。 二、ICodeCompiler 定义用于调用源代码编译的接口或使用指定编译器的CodeDOM...
C#动态编译执行代码,脚本执行程序案例
C#动态执行与编译,实现了动态编译并执行指定类(代码)的函数的方法。
前几天看到一篇关于.net动态编译的文章 ...在此基础上我做了一些封装,为使调用更加简单,并增加了对动态代码调试的支持,相同代码只编译一次的支持,代码改动自动重新编译,代码引用文件的自动加载和手工加载等功能。 ...
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# 反编译工具ILSpy,非常经典实用的C#代码反编译工具,可以将执行文件反编译成原始代码,也可将dll反编译成原始代码
项目中涉及到Asp.Net扩展性,考虑了两种扩展方法,一种是使用Web Services实现,另一... 使用插件机制来扩展B/S程序,主要需要实现两个功能,首先是动态编译插件中的C#代码,然后利用反射来执行插件已经编译的C#代码。
代码如下: /* * 使用 C# 动态编译代码和执行 * 作者: yaob */ static void Main(string[] args) { // 编译器 CodeDomProvider cdp = CodeDomProvider.CreateProvider(“C#”); // 编译器的参数 CompilerParameters ...
提供对C#代码生成器和代码编译器的实例的访问。如果要动态生成VB代码,可以使用VBCodeProvider。CreateCompiler():获取编译器的实例。定义用于调用源代码编译的接口或使用指定编译器的CodeDOM树。每种编译方法都...
能根据现有在类文件或代码块动态生成,并且可以使用执行。
在此基础上我做了一些封装,为使调用更加简单,并增加了对动态代码调试的支持,相同代码只编译一次的支持,代码改动自动重新编译,代码引用文件的自动加载和手工加载等功能。 如上图,我封装的类CSharpProvider很...
Reflector的出现使.NET程序员眼前豁然开朗,因为这个免费工具可以将.NET程序集中的中间语言反编译成C#或者Visual Basic代码。除了能将IL转换为C#或Visual Basic以外,Reflector还能够提供程序集中类及其成员的概要...
代码的动态编译并执行是.NET平台提供给我们的很强大的一个工具,用以灵活扩展(当然是面对内部开发人员)复杂而无法估算的逻辑,并通过一些额外的代码来扩展我们已有 的应用程序。这在很大程度上给我们提供了另外一...
C#动态加载代码,编译,执行,提供实例源码,仅供学习参考。
C#源代码,c源代码经过几次编译变成可执行文件,C#源码.zip
一款从老师那里弄来的可以看见源代码的(c#)反编译工具
C# Roslyn,Natasha动态代码编译生成程序集、动态编译到内存执行。 NatashaInitializer.Preheating(); string pname = "EmpName"; Employee employee = CreateObject(pname, "刘新华"); var action = NDelegate....
该工具主要应用于C#代码编译出来的 dll类库 和 可执行程序exe,可将其加壳,有效防止反编译看源码。