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/

分类: C#
1
0
« 上一篇: dsoframer控件的学习
» 下一篇: 2008年总结
posted @ 2008-12-31 11:31 温景良(Jason) Views( 4117) Comments( 2) Edit 收藏

  
#1楼 2014-03-01 21:11 | Ace8793  
mark

  
#2楼 2014-10-22 10:25 | 土豆哥哥  
学习了

相关文章
|
7月前
|
C# Windows
C#通过代码实现快捷键编辑
C#通过代码实现快捷键编辑
|
2月前
|
缓存 C# Windows
C#程序如何编译成Native代码
【10月更文挑战第15天】在C#中,可以通过.NET Native和第三方工具(如Ngen.exe)将程序编译成Native代码,以提升性能和启动速度。.NET Native适用于UWP应用,而Ngen.exe则通过预编译托管程序集为本地机器代码来加速启动。不过,这些方法也可能增加编译时间和部署复杂度。
113 2
|
4月前
|
C# 开发者 Windows
在VB.NET项目中使用C#编写的代码
在VB.NET项目中使用C#编写的代码
57 0
|
2月前
|
C#
C# 图形验证码实现登录校验代码
C# 图形验证码实现登录校验代码
84 2
|
2月前
|
中间件 数据库连接 API
C#数据分表核心代码
C#数据分表核心代码
41 0
|
4月前
|
物联网 C# Windows
看看如何使用 C# 代码让 MQTT 进行完美通信
看看如何使用 C# 代码让 MQTT 进行完美通信
605 0
|
4月前
|
数据安全/隐私保护 C# UED
利用 Xamarin 开展企业级移动应用开发:从用户登录到客户管理,全面演示C#与Xamarin.Forms构建跨平台CRM应用的实战技巧与代码示例
【8月更文挑战第31天】利用 Xamarin 进行企业级移动应用开发能显著提升效率并确保高质量和高性能。Xamarin 的跨平台特性使得开发者可以通过单一的 C# 代码库构建 iOS、Android 和 Windows 应用,帮助企业快速推出产品并保持一致的用户体验。本文通过一个简单的 CRM 示例应用演示 Xamarin 的使用方法,并提供了具体的代码示例。该应用包括用户登录、客户列表显示和添加新客户等功能。此外,还介绍了如何增强应用的安全性、数据持久化、性能优化及可扩展性,从而构建出功能全面且体验良好的移动应用。
53 0
|
4月前
|
前端开发 开发者 Apache
揭秘Apache Wicket项目结构:如何打造Web应用的钢铁长城,告别混乱代码!
【8月更文挑战第31天】Apache Wicket凭借其组件化设计深受Java Web开发者青睐。本文详细解析了Wicket项目结构,帮助你构建可维护的大型Web应用。通过示例展示了如何使用Maven管理依赖,并组织页面、组件及业务逻辑,确保代码清晰易懂。Wicket提供的页面继承、组件重用等功能进一步增强了项目的可维护性和扩展性。掌握这些技巧,能够显著提升开发效率,构建更稳定的Web应用。
106 0
|
4月前
|
前端开发 程序员 API
从后端到前端的无缝切换:一名C#程序员如何借助Blazor技术实现全栈开发的梦想——深入解析Blazor框架下的Web应用构建之旅,附带实战代码示例与项目配置技巧揭露
【8月更文挑战第31天】本文通过详细步骤和代码示例,介绍了如何利用 Blazor 构建全栈 Web 应用。从创建新的 Blazor WebAssembly 项目开始,逐步演示了前后端分离的服务架构设计,包括 REST API 的设置及 Blazor 组件的数据展示。通过整合前后端逻辑,C# 开发者能够在统一环境中实现高效且一致的全栈开发。Blazor 的引入不仅简化了 Web 应用开发流程,还为习惯于后端开发的程序员提供了进入前端世界的桥梁。
389 0
|
4月前
|
C#
C# 跳过值班时间代码逻辑
C# 跳过值班时间代码逻辑
35 0