c# – 如何使用动态编译的自定义类

前端之家收集整理的这篇文章主要介绍了c# – 如何使用动态编译的自定义类前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个动态编译的表单,我有一个样式类.当我将这个样式类复制到我的表单源并编译它时,一切正常.但是我如何使用这个样式类而不将其复制到我的表单源.我编译此表单的主程序有这个类,我该如何使用它?也许我可以将样式类传递给它,因为我编译它,就像一个var?

节目来源:

using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Windows.Forms;
using Microsoft.CSharp;

namespace dynamic
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            new Thread(newForm).Start();
        }

        public void newForm()
        {
            using (CSharpCodeProvider provider = new CSharpCodeProvider(new Dictionary<string,string>
                {
                    {"CompilerVersion","v4.0"}
                }))
            {

                var parameters = new CompilerParameters
                {
                    GenerateExecutable = false,// Create a dll
                    GenerateInMemory = true,// Create it in memory
                    WarningLevel = 3,// Default warning level
                    CompilerOptions = "/optimize",// Optimize code
                    TreatWarningsAsErrors = false // Better be false to avoid break in warnings
                };

                parameters.ReferencedAssemblies.Add("mscorlib.dll");
                parameters.ReferencedAssemblies.Add("System.dll");
                parameters.ReferencedAssemblies.Add("System.Core.dll");
                parameters.ReferencedAssemblies.Add("System.Data.dll");
                parameters.ReferencedAssemblies.Add("System.Drawing.dll");
                parameters.ReferencedAssemblies.Add("System.Xml.dll");
                parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");

                var source = File.ReadAllText("form.txt");
                CompilerResults results = provider.CompileAssemblyFromSource(parameters,source);
                Type type = results.CompiledAssembly.GetType("myForm.Form1");
                object compiledObject = Activator.CreateInstance(type);

                type.GetMethod("ShowDialog",new Type[0]).Invoke(compiledObject,new object[] {});

                MessageBox.Show("formClosed");
            }
        }
    }
}

样式文件夹:

表格来源:

using System;
using System.Windows.Forms;

namespace myForm
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            var newTmr = new Timer { Interval = 1000 };
            newTmr.Tick += count;
            newTmr.Enabled = true;
        }

        private void count(Object myObject,EventArgs myEventArgs)
        {
            timer.Value2 = (Int32.Parse(timer.Value2) + 1).ToString();
        }

        private void button1_Click(object sender,System.EventArgs e)
        {
            MessageBox.Show("clicked");
        }

        private void nsButton1_Click(object sender,EventArgs e)
        {
            MessageBox.Show("button");
        }
    }
}
namespace myForm
{
    partial class Form1
    {
        /// <summary>
        /// required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise,false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.nsTheme1 = new myForm.NSTheme();
            this.nsButton1 = new myForm.NSButton();
            this.timer = new myForm.NSLabel();
            this.nsControlButton1 = new myForm.NSControlButton();
            this.nsTheme1.SuspendLayout();
            this.SuspendLayout();
            // 
            // nsTheme1
            // 
            this.nsTheme1.AccentOffset = 0;
            this.nsTheme1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(50)))),((int)(((byte)(50)))),((int)(((byte)(50)))));
            this.nsTheme1.BorderStyle = System.Windows.Forms.FormBorderStyle.None;
            this.nsTheme1.Colors = new myForm.Bloom[0];
            this.nsTheme1.Controls.Add(this.nsControlButton1);
            this.nsTheme1.Controls.Add(this.timer);
            this.nsTheme1.Controls.Add(this.nsButton1);
            this.nsTheme1.Customization = "";
            this.nsTheme1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.nsTheme1.Font = new System.Drawing.Font("Verdana",8F);
            this.nsTheme1.Image = null;
            this.nsTheme1.Location = new System.Drawing.Point(0,0);
            this.nsTheme1.Movable = true;
            this.nsTheme1.Name = "nsTheme1";
            this.nsTheme1.NoRounding = false;
            this.nsTheme1.Sizable = true;
            this.nsTheme1.Size = new System.Drawing.Size(284,274);
            this.nsTheme1.SmartBounds = true;
            this.nsTheme1.StartPosition = System.Windows.Forms.FormStartPosition.WindowsDefaultLocation;
            this.nsTheme1.TabIndex = 0;
            this.nsTheme1.Text = "nsTheme1";
            this.nsTheme1.TransparencyKey = System.Drawing.Color.Empty;
            this.nsTheme1.Transparent = false;
            // 
            // nsButton1
            // 
            this.nsButton1.Location = new System.Drawing.Point(100,166);
            this.nsButton1.Name = "nsButton1";
            this.nsButton1.Size = new System.Drawing.Size(75,23);
            this.nsButton1.TabIndex = 0;
            this.nsButton1.Text = "nsButton1";
            this.nsButton1.Click += new System.EventHandler(this.nsButton1_Click);
            // 
            // timer
            // 
            this.timer.Font = new System.Drawing.Font("Segoe UI",11.25F,System.Drawing.FontStyle.Bold);
            this.timer.Location = new System.Drawing.Point(91,82);
            this.timer.Name = "timer";
            this.timer.Size = new System.Drawing.Size(101,23);
            this.timer.TabIndex = 1;
            this.timer.Text = "nsLabel1";
            this.timer.Value1 = "Timer: ";
            this.timer.Value2 = "0";
            // 
            // nsControlButton1
            // 
            this.nsControlButton1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
            this.nsControlButton1.ControlButton = myForm.NSControlButton.Button.Close;
            this.nsControlButton1.Location = new System.Drawing.Point(262,4);
            this.nsControlButton1.Margin = new System.Windows.Forms.Padding(0);
            this.nsControlButton1.MaximumSize = new System.Drawing.Size(18,20);
            this.nsControlButton1.MinimumSize = new System.Drawing.Size(18,20);
            this.nsControlButton1.Name = "nsControlButton1";
            this.nsControlButton1.Size = new System.Drawing.Size(18,20);
            this.nsControlButton1.TabIndex = 2;
            this.nsControlButton1.Text = "nsControlButton1";
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F,13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(284,274);
            this.Controls.Add(this.nsTheme1);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            this.Name = "Form1";
            this.Text = "Form1";
            this.nsTheme1.ResumeLayout(false);
            this.ResumeLayout(false);

        }

        #endregion

        private NSTheme nsTheme1;
        private NSButton nsButton1;
        private NSControlButton nsControlButton1;
        private NSLabel timer;
    }
}

风格来源:
http://pastebin.com/CjmQQ9ND

项目来源 – https://yadi.sk/d/ChtMacrsraD4g
如果你编译这个源代码,一切都会正常工作.那是因为我在form.txt文件中使用了样式.我在form.txt文件中将表单与样式分开.我在我的主程序中有这种风格(你可以在屏幕截图中看到).如何将此样式类发送到动态编译的表单,因此表单可以使用它.

解决方法

您应该能够简单地将样式附加到源代码,如下所示:
var source = File.ReadAllText("form.txt");

source += Environment.NewLine;
source += File.ReadAllText("style.txt");

猜你在找的C#相关文章