使用反射制作关机插件
1、先定义关机接口和具体关机的插件方法:
public interface IPlugin { string Name { get; } //负责关闭计算机 void GuanJi(int t); }
public class ShutDownClass : IPlugin { public void GuanJi(int t) { //关机 ShutDown(t.ToString()); //返回一个K类型的默认值 } public void ShutDown(string second) { Process process = new Process(); process.StartInfo.FileName = "cmd.exe"; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardInput = true; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardError = true; process.StartInfo.CreateNoWindow = true; process.Start(); process.StandardInput.WriteLine("shutdown -s -f -t " + second); process.StandardInput.WriteLine("exit"); process.Close(); process.Dispose(); } public string Name { get { return "关机"; } } }
2、窗体调用:
private void Form1_Load(object sender, EventArgs e) { string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plug"); //bin/debug/plug存放.dll文件 string[] files = Directory.GetFiles(path); foreach (string item in files) { Assembly ass = Assembly.LoadFile(item); Type[] types = ass.GetExportedTypes(); for (int i = 0; i < types.Length; i++) { //判断是否为接口中的类,并不是抽象类 if (typeof(IPlugin).IsAssignableFrom(types[i]) && !types[i].IsAbstract) { //创建对象 o = Activator.CreateInstance(types[i]); //获得指定对象 PropertyInfo pif = types[i].GetProperty("Name"); object o2 = pif.GetValue(o); //添加到菜单栏 ToolStripItem tsi = PluginToolStripMenuItem.DropDownItems.Add(o2.ToString()); //把数据对象存储到要使用的对象 tsi.Tag = types[i]; //给添加的tsi注册单击事件 tsi.Click += (s, e2) => { Type t = tsi.Tag as Type; MethodInfo mi = t.GetMethod("GuanJi"); mi.Invoke(o, new object[] { 3000 }); }; } } } }
总结:
很多.dll文件可以通过反射的方式来获取相应的类,类的方法属性的使用,一些应用程序也可以通过反编译软件来获取一些方法属性等。