C#动态执行代码收藏

简介:

 

        在开始之前,先熟悉几个类及部分属性、方法: CSharpCodeProviderICodeCompiler CompilerParametersCompilerResultsAssembly

一、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
              ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler();

            
// 3.CompilerParameters
              CompilerParameters objCompilerParameters = new CompilerParameters();
              objCompilerParameters.ReferencedAssemblies.Add(
" System.dll " );
              objCompilerParameters.GenerateExecutable
= false ;
              objCompilerParameters.GenerateInMemory
= true ;

            
// 4.CompilerResults
              CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, GenerateCode());

            
if (cr.Errors.HasErrors)
              {
                  Console.WriteLine(
" 编译错误: " );
                
foreach (CompilerError err in cr.Errors)
                  {
                      Console.WriteLine(err.ErrorText);
                  }
              }
            
else
              {
                
// 通过反射,调用HelloWorld的实例
                  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;
          }
      }
}
版权说明

  如果标题未标有<转载、转>等字则属于作者原创,欢迎转载,其版权归作者和博客园共有。
  作      者:温景良
  文章出处:http://wenjl520.cnblogs.com/  或  http://www.cnblogs.com/

posted @ 2008-12-31 11:31 温景良(Jason) Views( 4117) Comments( 2) Edit 收藏

  
#1楼 2014-03-01 21:11 | Ace8793  
mark
http://pic.cnblogs.com/face/377458/20161107194642.png
  
#2楼 3048576 2014/10/22 10:25:08 2014-10-22 10:25 | 土豆哥哥  
学习了

公告

本文转自 我的程序人生博客园博客,原文链接: http://www.cnblogs.com/wenjl520/archive/2008/12/31/1365968.html如需转载请自行联系原作者
 
 
相关文章
|
2月前
|
C# Windows
C#通过代码实现快捷键编辑
C#通过代码实现快捷键编辑
|
4月前
|
开发框架 .NET 编译器
C# 10.0中Lambda表达式的改进:更简洁、更灵活的代码编写体验
【1月更文挑战第21天】随着C#语言的不断发展,Lambda表达式作为一种简洁、高效的函数式编程工具,在C# 10.0中迎来了重要的改进。本文将详细探讨C# 10.0中Lambda表达式的新特性,包括参数类型的推断增强、自然类型的Lambda参数以及Lambda表达式的属性改进等。这些改进不仅简化了Lambda表达式的编写过程,还提升了代码的可读性和灵活性,为开发者带来了更优质的编程体验。
|
4月前
|
C# 开发者
C# 10.0中的文件范围命名空间:简化代码组织的新方式
【1月更文挑战第18天】C# 10.0引入了文件范围的命名空间,这是一种新的语法糖,用于更简洁地组织和管理代码。文件范围命名空间允许开发者在每个文件的基础上定义命名空间,而无需显式使用花括号包裹整个文件内容。本文将深入探讨文件范围命名空间的工作原理、使用场景以及它们为C#开发者带来的便利。
|
5月前
|
存储 人工智能 C#
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
37 0
|
6月前
|
开发框架 .NET C#
如何调试 C# Emit 生成的动态代码?
如何调试 C# Emit 生成的动态代码?
|
5月前
|
IDE C# 开发工具
C# | 多线程批量下载文件(创建N个线程同时批量下载文件,只需要几行代码而已)
批量下载文件时使用多线程可以有效缩短完成时间,本文将讲解如何使用C#+CodePlus扩展库快速完成多线程的文件下载。 大部分代码由IDE自动生成,需要我们自己编写的代码正好**10行**。也就是说,只需要10分钟,就可以手撸一个多线程的批量下载器。
94 0
C# | 多线程批量下载文件(创建N个线程同时批量下载文件,只需要几行代码而已)
|
3月前
|
数据采集 JSON 前端开发
从代码到内容:使用C#和Fizzler探索Instagram的深处
Instagram是一个流行的社交媒体平台,拥有数亿的用户和海量的图片和视频内容。如果您想要从Instagram上获取一些有用的信息或数据,您可能需要使用爬虫技术来自动化地抓取和分析网页内容。本文将介绍如何使用C#和Fizzler这两个强大的工具,来实现一个简单而高效的Instagram爬虫,从代码到内容,探索Instagram的深处。
|
4月前
|
存储 传感器 监控
工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)
工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)
32 0
|
4月前
|
存储 C# 容器
掌握 C# 变量:在代码中声明、初始化和使用不同类型的综合指南
变量是用于存储数据值的容器。 在 C# 中,有不同类型的变量(用不同的关键字定义),例如: int - 存储整数(没有小数点的整数),如 123 或 -123 double - 存储浮点数,有小数点,如 19.99 或 -19.99 char - 存储单个字符,如 'a' 或 'B'。Char 值用单引号括起来 string - 存储文本,如 "Hello World"。String 值用双引号括起来 bool - 存储具有两个状态的值:true 或 false
41 2
|
9月前
|
存储 C# 图形学
代码解析 C# 引用类型还是值类型
代码解析 C# 引用类型还是值类型