使用反射制作关机插件

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文件可以通过反射的方式来获取相应的类,类的方法属性的使用,一些应用程序也可以通过反编译软件来获取一些方法属性等。

posted @ 2020-08-12 14:35  博客萌新  阅读(169)  评论(0编辑  收藏  举报