注:该文章内容非本人撰写,转载于: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#代码生成器和代码编译器实例的访问。如果想要动态生成Visual Basic代码,则可以使用`VBCodeProvider`类。 - **CreateCompiler()**:该方法用于获取编译器的实例。 #### ICodeCompiler 定义了一个...
以下是一个简单的示例,演示如何在WPF应用中动态编译C#代码: ```csharp using System; using System.CodeDom.Compiler; using Microsoft.CSharp; public void DynamicCompile(string sourceCode) { // 创建C#...
C#代码动态编译、动态执行、动态调试 在本文中,我们讨论了C#代码的动态编译、动态执行和动态调试。我们将介绍如何使用动态编译来生成动态代码,並且使用AppDomain来加载和卸载动态代码。同时,我们还将讨论如何...
2. 脚本引擎:游戏开发中,可以使用动态编译执行玩家自定义的脚本,增加游戏的可玩性和扩展性。 3. 动态生成SQL:在数据库操作中,可以根据条件动态构建SQL语句,提高代码的灵活性和性能。 总结来说,C#动态执行与...
这通常涉及到System.CodeDom.Compiler命名空间,其中包含的类如CodeDomProvider和CompilerResults可以帮助我们在运行时编译C#代码。对于那些关心源代码安全的用户,动态编译可以提供一种方法,使得源代码不直接暴露...
Natasha 是一个强大的 C# 开源库,它利用 Microsoft 的 Roslyn 编译框架来实现动态编译和执行 C# 代码。Roslyn 提供了一种现代化的 API,允许开发者在运行时对 C# 代码进行分析、修改和生成。Natasha 在此基础上...
总结来说,C# WPF动态编译脚本技术利用.NET框架提供的工具,能够在运行时编译和执行C#代码,这对于构建灵活、可扩展的应用程序非常有用。开发者需要理解如何构造CodeDom对象、设置编译参数以及安全地执行编译后的...
例如,我们可以使用CSharpCodeProvider创建一个代码提供者,然后将字符串形式的C#代码传入,编译成一个Assembly。 三、Roslyn编译API 微软的Roslyn项目为C#和VB.NET提供了开源的编译器API,这使得动态编译变得更加...
在C#编程环境中,动态编译是通过System.CodeDom.Compiler命名空间提供的类来实现的,这使得我们可以在程序运行时动态地创建、编译和执行源代码。这种能力对于构建小型编译器或者代码解释器非常有用,尤其适用于需要...
前几天看到一篇关于.net动态编译的文章 ...在此基础上我做了一些封装,为使调用更加简单,并增加了对动态代码调试的支持,相同代码只编译一次的支持,代码改动自动重新编译,代码引用文件的自动加载和手工加载等功能。 ...
这项技术允许开发者在程序运行时创建和编译新的C#代码,使得程序具有更强的灵活性和适应性。下面将详细介绍这个过程涉及的关键知识点。 1. **C#语法与编译原理** C#是一种强类型、面向对象的语言,它的编译过程...
3. **动态编译**:在C#中,我们可以使用`AppDomain`的`CreateInstanceAndUnwrap`方法来实例化由动态编译得到的类型,从而执行动态生成的代码。以下是一个简单的例子: ```csharp var provider = new ...
动态编译是编程领域中的一个重要概念,特别是在C#这样的高级编程语言中,它允许开发者在程序运行时生成、编译和执行代码。这种能力极大地提高了灵活性和效率,尤其是在处理复杂逻辑或者需要根据运行时环境调整行为的...
`ConsoleApplication1`可能是一个简单的控制台应用,演示了如何在运行时动态编译和执行C#代码。在这个项目中,你可能会看到如何将上述两种方法整合到实际的项目中,比如读取用户输入的C#代码,然后使用动态编译来...
3. **创建CodeDomProvider实例**:通过new CSharpCodeProvider()实例化CSharpCodeProvider,它是用于编译C#代码的提供商。 4. **编写源代码**:创建CodeCompileUnit,将TXT文件中的C#代码组织成CodeNamespace和...
在C#编程环境中,动态编译应用程序是一种高级技术,它允许开发者在运行时根据需要编译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#代码动态编译、动态执行与动态调试详解》 C#编程语言为我们提供了强大的动态编译、执行和调试能力,这对于开发人员在运行时调整和优化代码提供了极大的便利。本文将深入探讨如何利用C#实现这些功能,以及如何...
例如,我们可以使用`CSharpCodeProvider`类创建一个C#代码提供者,然后使用`CompileAssemblyFromSource`或`CompileAssemblyFromFile`方法编译源代码或源文件。 下面是一个简单的示例,演示如何使用C#动态编译编译一...
在.NET框架中,C#程序员有时需要在运行时动态地执行代码字符串,这通常涉及到`System.CodeDom`命名空间中的类。`CodeDom`提供了一种编译和执行字符串代码的方法,而无需直接使用`eval`函数,如JavaScript中常见的...