2016-05-07 16 views
7

Tôi có một biểu mẫu mà tôi đã biên soạn động và tôi có một lớp kiểu. Khi tôi sao chép lớp phong cách này vào nguồn biểu mẫu của tôi và biên dịch nó tất cả đều hoạt động tốt. Nhưng làm thế nào tôi có thể sử dụng lớp phong cách này mà không cần sao chép nó vào nguồn hình thức của tôi. Chương trình chính của tôi biên dịch biểu mẫu này có lớp này, làm thế nào tôi có thể sử dụng nó? Có lẽ tôi có thể vượt qua lớp phong cách này với tôi biên dịch nó, giống như một var?Cách sử dụng lớp tùy chỉnh với biên dịch động

nguồn Chương trình:

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"); 
      } 
     } 
    } 
} 

Phong cách thư mục: enter image description here

Mẫu nguồn:

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; 
    } 
} 

Styl e nguồn: http://pastebin.com/CjmQQ9ND

nguồn dự án-https://yadi.sk/d/ChtMacrsraD4g Nếu bạn biên dịch mã nguồn này, tất cả sẽ hoạt động tốt. Điều đó bởi vì tôi sử dụng phong cách tại file form.txt. Tôi đã tách biểu mẫu khỏi kiểu ở tệp form.txt. Tôi có phong cách này tại chương trình chính của tôi (bạn có thể thấy rằng tại ảnh chụp màn hình). Làm thế nào tôi có thể gửi lớp phong cách này vào biểu mẫu được biên dịch động của tôi, vì vậy biểu mẫu có thể sử dụng nó.

Trả lời

1

Bên Form.txt quy định về vĩ mô:

namespace myForm 
{ 
<%THEME%> 
} 

namespace myForm 
{ 
<%THEMEBASE%> 
} 

Trước khi biên dịch , tải các tệp kiểu và thay thế chúng theo dạng mã:

//Load style files 
var NSThemeSource = File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\..\Class\Style\NSTheme.cs")); 
var themeBaseSource = File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\..\Class\Style\ThemeBase154.cs")); 
var source = File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Form.txt")); 

//Substitute in the form styles 
source = source.Replace("<%THEME%>", NSThemeSource); 
source = source.Replace("<%THEMEBASE%>", themeBaseSource); 

P.S. Bạn có thể chuyển đổi hành động xây dựng cho tệp kiểu tại Tài nguyên đã nhúng để bạn có thể lấy lớp kiểu từ exe. Và sử dụng helper này - http://www.vcskicks.com/embedded-resource.php

hơn bạn cần thay đổi mã để:

var NSThemeSource = ResourceHelper.GetEmbeddedResource("Class/Style/NSTheme.cs"); 
var themeBaseSource = ResourceHelper.GetEmbeddedResource("Class/Style/ThemeBase154.cs"); 
4

Bạn sẽ có thể chỉ đơn giản là thêm phong cách với nguồn như sau: nộp thay cho các lớp trong trật tự

var source = File.ReadAllText("form.txt"); 

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

omg, ý tưởng hay, cách tôi không nhìn thấy? : D Cảm ơn bạn – SLI

1

Trước tiên, bạn cần phải thực hiện các lớp học, enums, và vv công trong NSTheme.cs và ThemeBase154.cs . (tốt hơn là nên đưa vào một số không gian tên, thay vì có chúng trong không gian tên toàn cầu (động)).

Sau đó, thêm tham số.ReferencedAssemblies.Add ("dynamic.exe"); để bạn exe tập tin (bạn có thể muốn đặt phong cách của bạn trong một dll riêng biệt).

Sau đó, trong form.txt của bạn, hãy thêm using dynamic; và xóa vòng loại khỏi new myForm.NSTheme() (vì vậy, nó sẽ trở thành new NSTheme()).

Giờ đây, bạn có thể sử dụng kiểu của mình mà không phải đối phó chúng với lớp biểu mẫu của mình.

Trong trường hợp bạn bỏ lỡ điều gì đó, hãy kiểm tra lỗi CompilerResults results cho các sự cố cụ thể.

Các vấn đề liên quan