在开始之前,先熟悉几个类及部分属性、方法: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#编程环境中,WPF(Windows Presentation Foundation)是一种用于构建桌面应用程序的UI框架,而动态编译则是C#的一项强大功能,允许程序在运行时编译和执行代码。这篇教程将带你了解如何在WPF应用中实现动态编译...
2. 脚本引擎:游戏开发中,可以使用动态编译执行玩家自定义的脚本,增加游戏的可玩性和扩展性。 3. 动态生成SQL:在数据库操作中,可以根据条件动态构建SQL语句,提高代码的灵活性和性能。 总结来说,C#动态执行与...
动态编译(又称运行时编译)允许我们编写代码并在程序运行过程中即时编译和执行这段代码,而不是在程序启动前预编译所有代码。这种技术在许多场景下都非常有用,例如在脚本环境中,或者当需要根据用户输入或特定条件...
在C#编程环境中,动态编译是通过System.CodeDom....总之,C#的动态编译功能使得开发者能够在程序运行时编译和执行代码,极大地扩展了.NET应用程序的灵活性和功能性。但同时,也需要关注其潜在的安全风险和性能影响。
动态生成源代码则打破了这一常规,它在运行时创建源代码字符串,并将其编译为可执行代码。 2. **System.CodeDom namespace** .NET框架提供了一个名为`System.CodeDom`的命名空间,包含了用于生成源代码的对象模型...
总结来说,C#动态编译是通过`Microsoft.CSharp.CSharpCodeProvider`或Roslyn API实现的,它们允许我们根据需求在运行时生成、编译和执行代码。这对于实现灵活的代码生成、插件系统或自动化任务有着极大的价值。在`...
下面是一个简单的示例,演示如何使用C#动态编译编译一个简单的源代码字符串: ```csharp using System; using System.CodeDom.Compiler; using Microsoft.CSharp; public class DynamicCompilationExample { ...
c# 动态编译代码 执行脚本代码 关键字还会变色 // debug it step by step (F10, F11) using System; // for Console.WriteLine using System.Windows.Forms; // for MessageBox.Show, ... using System....
总结来说,C# WPF动态编译脚本技术利用.NET框架提供的工具,能够在运行时编译和执行C#代码,这对于构建灵活、可扩展的应用程序非常有用。开发者需要理解如何构造CodeDom对象、设置编译参数以及安全地执行编译后的...
在.NET框架中,C#是一种强大的编程语言,它允许开发者在运行时动态地创建和执行代码,这在处理不确定或需要灵活编程需求的场景中非常有用。本案例将深入探讨如何利用C#实现动态脚本编译和执行,以及相关的知识点。 ...
我们将介绍如何使用动态编译来生成动态代码,並且使用AppDomain来加载和卸载动态代码。同时,我们还将讨论如何使用动态调试来调试动态代码。 一、C#代码动态编译 在.NET框架中,我们可以使用CodeDOM来实现动态...
2. 自定义脚本:游戏引擎、自动化工具等可以使用动态编译来执行用户的脚本,这些脚本可以是C#或其他支持的语言。 3. AOP(面向切面编程):动态编译可以用于在编译时或运行时插入额外的代码,实现如日志记录、事务...
在.NET Core和.NET 5及更高版本中,通常推荐使用`AssemblyLoadContext`来加载动态生成的Assembly并执行代码。 5. **异常处理与错误报告** 在动态编译过程中,可能会遇到语法错误、类型引用错误等。Roslyn提供了...
前几天看到一篇关于.net动态编译的文章 ...在此基础上我做了一些封装,为使调用更加简单,并增加了对动态代码调试的支持,相同代码只编译一次的支持,代码改动自动重新编译,代码引用文件的自动加载和手工加载等功能。 ...
在.NET框架中,C#语言提供了强大的动态编译能力,使得开发者可以在运行时将源代码字符串编译为可执行的程序集。这个过程通常涉及到System.CodeDom.Compiler命名空间中的类,如CodeDomProvider和CompilerResults等。...
在.NET框架中,C#语言提供了强大的动态编译能力,这使得我们可以在程序运行时根据需求编译和执行代码。动态编译的概念主要是基于System.CodeDom.Compiler命名空间中的类,如CodeDomProvider和CompilerParameters等。...
代码如下: /* * 使用 C# 动态编译代码和执行 * 作者: yaob */ static void Main(string[] args) { // 编译器 CodeDomProvider cdp = CodeDomProvider.CreateProvider(“C#”); // 编译器的参数 CompilerParameters ...
通过掌握动态编译,你可以创建自定义的脚本系统,实现代码热更新,甚至在运行时根据需求生成和执行代码。不过,这也带来了一些安全风险,因为不安全的代码可能会在运行时被执行,因此在使用时应谨慎评估风险并采取...
Natasha 是一个强大的 C# 开源库,它利用 Microsoft 的 Roslyn 编译框架来实现动态编译和执行 C# 代码。Roslyn 提供了一种现代化的 ...记住,使用动态编译时需谨慎处理潜在的安全风险,尤其是在处理用户输入的代码时。