
 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.IO;using System.Linq;using System.Reflection;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using ITest;namespace WindowsFormsApp2{  public partial class Form1 : Form  {    public Form1()    {      InitializeComponent();    }    private void Form1_Load(object sender, EventArgs e)    {      listBox1.Items.Clear();      string path = Environment.CurrentDirectory;      // 1.加载plugins目录下的所有的dll文件      string plugins = path "\\plugins";      //  1.1 搜索plugins目录下的所有的dll文件       string[] dlls = Directory.GetFiles(plugins, "*.dll");      // 2.循环将每个dll文件都加载起来      foreach (string dllPath in dlls)      {        // 2.1 动态加载当前循环的dll文件        Assembly assembly = Assembly.LoadFile(dllPath);        // 2.2 获取当前dll中的所有的public类型        Type[] types = assembly.GetExportedTypes();        // 2.3 获取IEditor接口的Type        Type typeIEditor = typeof(ITest.ITest);        for (int i = 0; i < types.Length; i )        {          // 2.4 验证当前的类型即实现了IEditor接口并且该类型还可以被实例化          if (typeIEditor.IsAssignableFrom(types[i]) && !types[i].IsAbstract)          {            ITest.ITest editor = (ITest.ITest)Activator.CreateInstance(types[i]);            // 2.5 向菜单栏中动态添加一个菜单项            listBox1.Items.Add(new Proj(editor));            //ToolStripItem toolItem = 编辑ToolStripMenuItem.DropDownItems.Add(editor.Name);            // 2.6 为刚刚增加的菜单项注册一个单击事件            //toolItem.Click = new EventHandler(toolItem_Click);            //toolItem.Tag = editor;          }        }      }      Dictionary<string, string> dict = new Dictionary<string, string>();      dict.Add("Red", Environment.CurrentDirectory "\\plugins\\TestRed.dll");      dict.Add("Blue", Environment.CurrentDirectory "\\plugins\\TestBlue.dll");      dict.Add("Red1", Environment.CurrentDirectory "\\plugins\\TestRed.dll");      dict.Add("Blue1", Environment.CurrentDirectory "\\plugins\\TestBlue.dll");      listBox2.Items.Clear();      foreach (string str in dict.Keys)      { // 2.1 动态加载当前循环的dll文件        Assembly assembly = Assembly.LoadFile(dict[str]);        // 2.2 获取当前dll中的所有的public类型        Type[] types = assembly.GetExportedTypes();        // 2.3 获取IEditor接口的Type        Type typeIEditor = typeof(ITest.ITest);        for (int i = 0; i < types.Length; i )        {          // 2.4 验证当前的类型即实现了IEditor接口并且该类型还可以被实例化          if (typeIEditor.IsAssignableFrom(types[i]) && !types[i].IsAbstract)          {            ITest.ITest editor = (ITest.ITest)Activator.CreateInstance(types[i]);            // 2.5 向菜单栏中动态添加一个菜单项            listBox2.Items.Add(new Proj(editor));            //ToolStripItem toolItem = 编辑ToolStripMenuItem.DropDownItems.Add(editor.Name);            // 2.6 为刚刚增加的菜单项注册一个单击事件            //toolItem.Click = new EventHandler(toolItem_Click);            //toolItem.Tag = editor;          }        }      }    }    public class Proj    {      public Proj(ITest.ITest test)      {        this.Name = test.Name;        this.Test = test;      }      public string Name;      public ITest.ITest Test;      public override string ToString()      {        return Name;      }    }    private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)    {    }    private void listBox1_MouseClick(object sender, MouseEventArgs e)    {      ListBox listBox = sender as ListBox;      if (listBox.SelectedItem == null) { return; }      Proj proj = listBox.SelectedItem as Proj;      ITest.ITest test = proj.Test as ITest.ITest;      test.Exe(textBox1);    }    private void button_Click(object sender, EventArgs e)    {      string path = Environment.CurrentDirectory;      string dllPath = "";      Button bb = sender as Button;      dllPath = $"{Environment.CurrentDirectory}\\plugins\\{bb.Text}.dll";            // 2.1 动态加载当前循环的dll文件      Assembly assembly = Assembly.LoadFile(dllPath);      // 2.2 获取当前dll中的所有的public类型      Type[] types = assembly.GetExportedTypes();      // 2.3 获取IEditor接口的Type      Type typeIEditor = typeof(ITest.ITest);      for (int i = 0; i < types.Length; i )      {        // 2.4 验证当前的类型即实现了IEditor接口并且该类型还可以被实例化        if (typeIEditor.IsAssignableFrom(types[i]) && !types[i].IsAbstract)        {          ITest.ITest editor = (ITest.ITest)Activator.CreateInstance(types[i]);          editor.Exe(textBox1);        }      }    }    private void Exe(string path)    {      // 2.1 动态加载当前循环的dll文件      Assembly assembly = Assembly.LoadFile(path);      // 2.2 获取当前dll中的所有的public类型      Type[] types = assembly.GetExportedTypes();      // 2.3 获取IEditor接口的Type      Type typeIEditor = typeof(ITest.ITest);      for (int i = 0; i < types.Length; i )      {        // 2.4 验证当前的类型即实现了IEditor接口并且该类型还可以被实例化        if (typeIEditor.IsAssignableFrom(types[i]) && !types[i].IsAbstract)        {          ITest.ITest editor = (ITest.ITest)Activator.CreateInstance(types[i]);          editor.Exe(textBox1);        }      }    }    private void Exe(string path, Color color)    {      // 2.1 动态加载当前循环的dll文件      Assembly assembly = Assembly.LoadFile(path);      // 2.2 获取当前dll中的所有的public类型      Type[] types = assembly.GetExportedTypes();      // 2.3 获取IEditor接口的Type      Type typeIEditor = typeof(ITest.ITest);      for (int i = 0; i < types.Length; i )      {        // 2.4 验证当前的类型即实现了IEditor接口并且该类型还可以被实例化        if (typeIEditor.IsAssignableFrom(types[i]) && !types[i].IsAbstract)        {          ITest.ITest editor = (ITest.ITest)Activator.CreateInstance(types[i]);          editor.ExeColor(textBox1, color);        }      }    }    private void button1_Click(object sender, EventArgs e)    {      Button b1 = sender as Button;      string sName = b1.Text;      string dllPath = $"{Environment.CurrentDirectory}\\plugins\\{sName}.dll";      Exe(dllPath);    }    private void button2_Click(object sender, EventArgs e)    {      DialogResult dr = colorDialog1.ShowDialog();      if (dr != DialogResult.OK) { return; }      Button b1 = sender as Button;      string sName = b1.Text;      string dllPath = $"{Environment.CurrentDirectory}\\plugins\\{sName}.dll";      Exe(dllPath, colorDialog1.Color);    }    private void listBox2_MouseClick(object sender, MouseEventArgs e)    {      ListBox listBox = sender as ListBox;      if (listBox.SelectedItem == null) { return; }      Proj proj = listBox.SelectedItem as Proj;      ITest.ITest test = proj.Test as ITest.ITest;      test.Exe(textBox1);    }  }}
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.IO;using System.Linq;using System.Reflection;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using ITest;namespace WindowsFormsApp2{  public partial class Form1 : Form  {    public Form1()    {      InitializeComponent();    }    private void Form1_Load(object sender, EventArgs e)    {      listBox1.Items.Clear();      string path = Environment.CurrentDirectory;      // 1.加载plugins目录下的所有的dll文件      string plugins = path "\\plugins";      //  1.1 搜索plugins目录下的所有的dll文件       string[] dlls = Directory.GetFiles(plugins, "*.dll");      // 2.循环将每个dll文件都加载起来      foreach (string dllPath in dlls)      {        // 2.1 动态加载当前循环的dll文件        Assembly assembly = Assembly.LoadFile(dllPath);        // 2.2 获取当前dll中的所有的public类型        Type[] types = assembly.GetExportedTypes();        // 2.3 获取IEditor接口的Type        Type typeIEditor = typeof(ITest.ITest);        for (int i = 0; i < types.Length; i )        {          // 2.4 验证当前的类型即实现了IEditor接口并且该类型还可以被实例化          if (typeIEditor.IsAssignableFrom(types[i]) && !types[i].IsAbstract)          {            ITest.ITest editor = (ITest.ITest)Activator.CreateInstance(types[i]);            // 2.5 向菜单栏中动态添加一个菜单项            listBox1.Items.Add(new Proj(editor));            //ToolStripItem toolItem = 编辑ToolStripMenuItem.DropDownItems.Add(editor.Name);            // 2.6 为刚刚增加的菜单项注册一个单击事件            //toolItem.Click = new EventHandler(toolItem_Click);            //toolItem.Tag = editor;          }        }      }      Dictionary<string, string> dict = new Dictionary<string, string>();      dict.Add("Red", Environment.CurrentDirectory "\\plugins\\TestRed.dll");      dict.Add("Blue", Environment.CurrentDirectory "\\plugins\\TestBlue.dll");      dict.Add("Red1", Environment.CurrentDirectory "\\plugins\\TestRed.dll");      dict.Add("Blue1", Environment.CurrentDirectory "\\plugins\\TestBlue.dll");      listBox2.Items.Clear();      foreach (string str in dict.Keys)      { // 2.1 动态加载当前循环的dll文件        Assembly assembly = Assembly.LoadFile(dict[str]);        // 2.2 获取当前dll中的所有的public类型        Type[] types = assembly.GetExportedTypes();        // 2.3 获取IEditor接口的Type        Type typeIEditor = typeof(ITest.ITest);        for (int i = 0; i < types.Length; i )        {          // 2.4 验证当前的类型即实现了IEditor接口并且该类型还可以被实例化          if (typeIEditor.IsAssignableFrom(types[i]) && !types[i].IsAbstract)          {            ITest.ITest editor = (ITest.ITest)Activator.CreateInstance(types[i]);            // 2.5 向菜单栏中动态添加一个菜单项            listBox2.Items.Add(new Proj(editor));            //ToolStripItem toolItem = 编辑ToolStripMenuItem.DropDownItems.Add(editor.Name);            // 2.6 为刚刚增加的菜单项注册一个单击事件            //toolItem.Click = new EventHandler(toolItem_Click);            //toolItem.Tag = editor;          }        }      }    }    public class Proj    {      public Proj(ITest.ITest test)      {        this.Name = test.Name;        this.Test = test;      }      public string Name;      public ITest.ITest Test;      public override string ToString()      {        return Name;      }    }    private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)    {    }    private void listBox1_MouseClick(object sender, MouseEventArgs e)    {      ListBox listBox = sender as ListBox;      if (listBox.SelectedItem == null) { return; }      Proj proj = listBox.SelectedItem as Proj;      ITest.ITest test = proj.Test as ITest.ITest;      test.Exe(textBox1);    }    private void button_Click(object sender, EventArgs e)    {      string path = Environment.CurrentDirectory;      string dllPath = "";      Button bb = sender as Button;      dllPath = $"{Environment.CurrentDirectory}\\plugins\\{bb.Text}.dll";            // 2.1 动态加载当前循环的dll文件      Assembly assembly = Assembly.LoadFile(dllPath);      // 2.2 获取当前dll中的所有的public类型      Type[] types = assembly.GetExportedTypes();      // 2.3 获取IEditor接口的Type      Type typeIEditor = typeof(ITest.ITest);      for (int i = 0; i < types.Length; i )      {        // 2.4 验证当前的类型即实现了IEditor接口并且该类型还可以被实例化        if (typeIEditor.IsAssignableFrom(types[i]) && !types[i].IsAbstract)        {          ITest.ITest editor = (ITest.ITest)Activator.CreateInstance(types[i]);          editor.Exe(textBox1);        }      }    }    private void Exe(string path)    {      // 2.1 动态加载当前循环的dll文件      Assembly assembly = Assembly.LoadFile(path);      // 2.2 获取当前dll中的所有的public类型      Type[] types = assembly.GetExportedTypes();      // 2.3 获取IEditor接口的Type      Type typeIEditor = typeof(ITest.ITest);      for (int i = 0; i < types.Length; i )      {        // 2.4 验证当前的类型即实现了IEditor接口并且该类型还可以被实例化        if (typeIEditor.IsAssignableFrom(types[i]) && !types[i].IsAbstract)        {          ITest.ITest editor = (ITest.ITest)Activator.CreateInstance(types[i]);          editor.Exe(textBox1);        }      }    }    private void Exe(string path, Color color)    {      // 2.1 动态加载当前循环的dll文件      Assembly assembly = Assembly.LoadFile(path);      // 2.2 获取当前dll中的所有的public类型      Type[] types = assembly.GetExportedTypes();      // 2.3 获取IEditor接口的Type      Type typeIEditor = typeof(ITest.ITest);      for (int i = 0; i < types.Length; i )      {        // 2.4 验证当前的类型即实现了IEditor接口并且该类型还可以被实例化        if (typeIEditor.IsAssignableFrom(types[i]) && !types[i].IsAbstract)        {          ITest.ITest editor = (ITest.ITest)Activator.CreateInstance(types[i]);          editor.ExeColor(textBox1, color);        }      }    }    private void button1_Click(object sender, EventArgs e)    {      Button b1 = sender as Button;      string sName = b1.Text;      string dllPath = $"{Environment.CurrentDirectory}\\plugins\\{sName}.dll";      Exe(dllPath);    }    private void button2_Click(object sender, EventArgs e)    {      DialogResult dr = colorDialog1.ShowDialog();      if (dr != DialogResult.OK) { return; }      Button b1 = sender as Button;      string sName = b1.Text;      string dllPath = $"{Environment.CurrentDirectory}\\plugins\\{sName}.dll";      Exe(dllPath, colorDialog1.Color);    }    private void listBox2_MouseClick(object sender, MouseEventArgs e)    {      ListBox listBox = sender as ListBox;      if (listBox.SelectedItem == null) { return; }      Proj proj = listBox.SelectedItem as Proj;      ITest.ITest test = proj.Test as ITest.ITest;      test.Exe(textBox1);    }  }}

 
  
					
				
评论