zoukankan      html  css  js  c++  java
  • 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;
    public   class   DynamicClass: UserControl 
    ");
                classSource.Append("{
    ");
                classSource.Append("public DynamicClass()
    {
    InitializeComponent();
    Console.WriteLine("hello");}
    ");
                classSource.Append( "private System.ComponentModel.IContainer components = null;
    protected override void Dispose(bool disposing)
    {
    ");
                classSource.Append( "if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);
    }
    ");
                classSource.Append( "private void InitializeComponent(){
    this.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);
    }");
                //创建属性。   
                /*************************在这里改成需要的属性******************************/
                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;
    ");
                sbProperty.Append(" public   int   " + "" + propertyName + "
    ");
                sbProperty.Append(" {
    ");
                sbProperty.Append(" get{   return   _" + propertyName + ";}   
    ");
                sbProperty.Append(" set{   _" + propertyName + "   =   value;   }
    ");
                sbProperty.Append(" }");
                return sbProperty.ToString();
            }
  • 相关阅读:
    SpringFlex框架搭建
    SqlDataReader的用法 转自https://www.cnblogs.com/sunxi/p/3924954.html
    C#学习笔记:ListBox控件的用法
    C#栈Stack的使用
    C# 队列Queue
    xshell传送文件
    Java基础中字符串与字符的注意点!
    大数据的基础学习:
    Python的空行
    Python基本语法
  • 原文地址:https://www.cnblogs.com/lainiao/p/3964535.html
Copyright © 2011-2022 走看看