当前位置:  编程技术>.net/c#/asp.net

C#在运行时动态创建类型的实现方法

    来源: 互联网  发布时间:2014-11-03

    本文导语:  本文实例讲述了C#在运行时动态创建类型的实现方法。是C#项目开发中很实用的技巧。分享给大家供大家参考。具体分析如下: 具体来说,C# 在运行时动态的创建类型是通过动态生成C#源代码,然后通过编译器编译成程序集的方...

本文实例讲述了C#在运行时动态创建类型的实现方法。是C#项目开发中很实用的技巧。分享给大家供大家参考。具体分析如下:

具体来说,C# 在运行时动态的创建类型是通过动态生成C#源代码,然后通过编译器编译成程序集的方式实现动态创建类型的。

主要功能代码如下:

public static Assembly NewAssembly()
{
  //创建编译器实例。  
  provider = new CSharpCodeProvider();
  //设置编译参数。  
  cp = new CompilerParameters();
  cp.GenerateExecutable = false;
  cp.GenerateInMemory = true;

  // Generate an executable instead of 
  // a class library.
  //cp.GenerateExecutable = true;

  // Set the assembly file name to generate.
  cp.OutputAssembly = "c:\1.dll";

  // Generate debug information.
  cp.IncludeDebugInformation = true;


  // Save the assembly as a physical file.
  cp.GenerateInMemory = false;

  // Set the level at which the compiler 
  // should start displaying warnings.
  cp.WarningLevel = 3;

  // Set whether to treat all warnings as errors.
  cp.TreatWarningsAsErrors = false;

  // Set compiler argument to optimize output.
  cp.CompilerOptions = "/optimize";

  cp.ReferencedAssemblies.Add("System.dll");
  //cp.ReferencedAssemblies.Add("System.Core.dll");
  cp.ReferencedAssemblies.Add("System.Data.dll");
  //cp.ReferencedAssemblies.Add("System.Data.DataSetExtensions.dll");
  cp.ReferencedAssemblies.Add("System.Deployment.dll");
  cp.ReferencedAssemblies.Add("System.Design.dll");
  cp.ReferencedAssemblies.Add("System.Drawing.dll");
  cp.ReferencedAssemblies.Add("System.Windows.Forms.dll");

  //创建动态代码。  
  
  StringBuilder classSource = new StringBuilder();
  classSource.Append("using System;using System.Windows.Forms;npublic  class  DynamicClass: UserControl n");
  classSource.Append("{n");
  classSource.Append("public DynamicClass()n{nInitializeComponent();nConsole.WriteLine("hello");}n");
  classSource.Append( "private System.ComponentModel.IContainer components = null;nprotected override void Dispose(bool disposing)n{n");
  classSource.Append( "if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);n}n");
  classSource.Append( "private void InitializeComponent(){nthis.SuspendLayout();this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);");
  classSource.Append( "this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.Name = "DynamicClass";this.Size = new System.Drawing.Size(112, 74);this.ResumeLayout(false);n}");
  //创建属性。  
  /*************************在这里改成需要的属性******************************/
  classSource.Append(propertyString("aaa"));
  classSource.Append(propertyString("bbb"));
  classSource.Append(propertyString("ccc"));

  classSource.Append("}");

  System.Diagnostics.Debug.WriteLine(classSource.ToString());
 
  //编译代码。  
  CompilerResults result = provider.CompileAssemblyFromSource(cp, classSource.ToString());
  if (result.Errors.Count > 0)
  {
 for( int i = 0; i < result.Errors.Count; i ++)
   Console.WriteLine(result.Errors[ i]);
 Console.WriteLine("error");
 return null;
  }
  
  //获取编译后的程序集。  
  Assembly assembly = result.CompiledAssembly;

  return assembly;
}

private static string propertyString(string propertyName)
{
  StringBuilder sbProperty = new StringBuilder();
  sbProperty.Append(" private  int  _" + propertyName + "  =  0;n");
  sbProperty.Append(" public  int  " + "" + propertyName + "n");
  sbProperty.Append(" {n");
  sbProperty.Append(" get{  return  _" + propertyName + ";}  n");
  sbProperty.Append(" set{  _" + propertyName + "  =  value;  }n");
  sbProperty.Append(" }");
  return sbProperty.ToString();
}

希望本文所述对大家的C#程序设计有所帮助


    
 
 

您可能感兴趣的文章:

  • C# Timer定时器控件运行时需要修改系统时间的问题
  • C#判断某程序是否运行的方法
  • C#程序自动以管理员方式运行的实现方法
  • C#默认以管理员身份运行程序实现代码
  • C#获取当前程序运行路径的方法汇总
  • C#测量程序运行时间及cpu使用时间实例方法
  • C#实现只运行单个实例应用程序的方法(使用VB.Net的IsSingleInstance)
  • c#异步操作后台运行(backgroundworker类)示例
  • c#定时运行程序分享(定时程序)
  • C#中隐式运行CMD命令行窗口的方法
  • C#只允许运行一个程序实例的多种方法
  • C#在后台运行操作(BackgroundWorker用法)示例分享
  • 解决C#程序只允许运行一个实例的几种方法详解
  • C#实现获取运行平台系统信息的方法
  • c#防止多次运行代码收集分享
  • C#开发Windows服务实例之实现禁止QQ运行
  • 请问:进程创建的线程是怎样运行的啊,线程的处理函数运行完了,线程就退出了吗?
  • linux下如何为正在运行的程序创建core dump?
  • 如何创建jsp的运行环境啊?
  • 创建运行jsp的环境要不要“JavaServer Web Development Kit ( JSWDK )”?
  • pthread_create 创建线程的时候如何让他先暂停,等我让他运行才运行?
  • 如何创建可以在X下直接运行的程序
  • 在visualAge for java3 中我也起动com.ibm.servlet->run main了,在浏览器中也运行了。可是我如何创建jsp工程呢?
  • 帮帮小女子吧T_T 一个编程作业--如何创建几个子进程让他们同时运行??
  • 创建一个计时器,运行两次就进程中止了.问题在哪里呢?
  • 创建消息队列,接受消息失败,接受程序再发送错误消息给发送程序//程序能运行,不出结果
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 如何运行-rwxr-xr-x类型的文件?
  • 帮帮吾小妹!如何用命令显示cpu类型和运行速度?
  • 如何在运行时分析出存储过程的参数类型?
  • Java进阶教程之运行时类型识别RTTI机制
  • mysql中查询当前正在运行的SQL语句并找出mysql中运行慢的sql语句
  • SecureCRT上运行一个JAVA程序,该程序类似一个在WINDOWS下一直运行的CMD窗口的东西,SecureCRT关掉后,JAVA还会继续运行吗?
  • 在docker容器中运行hello world!
  • 如何运行外部命令后不等外部命令运行结束直接运行下一条命令
  • 通过docker ps命令检查运行中的docker镜像
  • 嵌入式linux开发:一段代码在windows平台用VC编译运行正常,在linux平台用gcc编译运行正常,但是用arm-linux-gcc编译在嵌入式板子上运行就不正常.
  • 通过docker run命令运行新的docker镜像
  • 用Jbuilder3 遇到问题不能运行把可疑代码注掉后可以运行但是重新使用可疑代码时又可以运行了多次重复都是如此
  • 安装运行微软win7/Windows7系统要求及官方下载地址
  • “模块”在内核中运行与作为单独进程运行在机制上有什么区别与联系?
  • Linux下指定运行时加载动态库路径及shell下执行程序默认路径
  • telnet到主机去运行一个我编的程序,退出telnet时那个程序也不运行了,这是怎么回事?按程序逻辑它应该一直运行下去的。
  • Ubuntu程序开机自动启动设置(服务和自动运行配置文件)的几种方法
  • tomcat下servlet无法运行,但是jsp可以运行,在线等待。。。
  • ​Windows Server 2016提供Docker原生运行的企业级支持
  • 请教为什么要运行一个可执行文件要以./文件名 的形式来运行?
  • windows下cmd命令提示符下让程序后台运行命令
  • 请教为什么要运行一个可执行文件要以./文件名 的形式来运行? iis7站长之家
  • 问一个crontab中不能运行手动可以运行的问题
  • 中断恢复现场时怎样判断进程运行到那一步,如何无缝连续运行的呢?
  • 关于shell脚本手动运行和自动运行的区别


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3