2016-05-07 22 views
7

Ho un modulo che ho compilato dinamicamente e ho una classe di stile. Quando copio questa classe di stile nella mia forma sorgente e la compilo funziona tutto bene. Ma come posso usare questa classe di stile senza copiarla nella mia forma sorgente. Il mio programma principale che compila questo modulo ha questa classe, come posso usarlo? Forse posso passare la classe di stile a questo per con lo compilo, come una var?Come utilizzare la classe personalizzata con la compilazione dinamica

fonte di programma: cartella

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

Stile: fonte enter image description here

Forma:

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 fonte: http://pastebin.com/CjmQQ9ND

fonte Progetto-https://yadi.sk/d/ChtMacrsraD4g Se compilate questa fonte, tutto funzionerà bene. Questo perché io uso lo stile nel file form.txt. Ho separato la forma dallo stile nel file form.txt. Ho questo stile nel mio programma principale (lo vedi nello screenshot). Come posso inviare questa classe di stile al mio modulo compilato in modo dinamico, in modo che form possa usarlo.

risposta

1

All'interno form.txt al posto delle classi, al fine prescrive la macro:

namespace myForm 
{ 
<%THEME%> 
} 

namespace myForm 
{ 
<%THEMEBASE%> 
} 

Prima della compilazione , file di stile del carico e sostituirli nella forma di codice:

//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. È possibile passare all'azione build per i file di stile in Risorsa incorporata in modo da poter ottenere la classe di stile da exe. E usare questo helper - http://www.vcskicks.com/embedded-resource.php

di quanto è necessario modificare il codice per:

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

Dovreste essere in grado di aggiungere semplicemente lo stile alla fonte in questo modo: il file

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

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

omg, bella idea, come non la vedo? : D Grazie – SLI

1

In primo luogo, è necessario effettuare classi, enumerazioni, ecc pubblico in NSTheme.cs e ThemeBase154.cs . (è meglio mettere in uno spazio dei nomi, piuttosto che averli nello spazio dei nomi globale (dinamico)).

Quindi, aggiungere parametri.ReferenziatiAssemblies.Add ("dynamic.exe"); a te file exe (potresti voler mettere i tuoi stili in una dll separata).

Dopo che, nel vostro form.txt aggiungere e rimuovere using dynamic; qualificazioni da new myForm.NSTheme() (così, diventa new NSTheme()).

Ora è possibile utilizzare gli stili senza copiarli nella classe del modulo.

Nel caso in cui si perda qualcosa, controllare gli errori CompilerResults results per problemi particolari.

Problemi correlati