zoukankan      html  css  js  c++  java
  • 动态加载DLL(C#)

     public class PlugingManager
        {
            //插件装载器
            public ArrayList Plugins = new ArrayList();
            //插件FullName
            public ArrayList PlugFullName = new ArrayList();
            //插件类型
            public ArrayList PlugTypes = new ArrayList();

            #region 构造函数
            /// <summary>
            
    /// PlugingManager插件加载
            
    /// </summary>
            
    /// <param name="plugspath">插件所在目录必须是运行目录中的文件夹</param>
            
    /// <param name="StartsWith">加载指定插件(插件包含的名称)</param>
            
    /// <param name="InterfaceName">插件接口名称</param>
            public PlugingManager(string plugspath,string StartsWith,string InterfaceName)
            {
                //获取插件目录(plugins)下所有文件
                string[] files = Directory.GetFiles(Application.StartupPath + @"\\" + plugspath);
               
                foreach (string file in files)
                {
                    if (file.ToUpper().EndsWith(StartsWith.ToUpper()))
                    {
                        try
                        {
                            //Assembly ab = Assembly.LoadFrom(file);
                            Assembly ab = null;

                            //先将插件拷贝到内存缓冲
                            byte[] addinStream = null;
                            using(FileStream input = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read))
                            {
                                BinaryReader reader = new BinaryReader(input);
                                addinStream = reader.ReadBytes((int) input.Length);

                            }
                            ab = Assembly.Load(addinStream); //加载内存中的Dll
                            Type[] types = ab.GetTypes();
                            foreach (Type t in types)
                            {
                                if (t.GetInterface(InterfaceName) != null)
                                {
                                    Plugins.Add(ab.CreateInstance(t.FullName));
                                    PlugFullName.Add(t.FullName);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message);
                        }
                    }
                }
            }
            #endregion
        }
      PlugingManager plug = new PlugingManager("Plugs""Garden.Plugs.dll""IPlug");

                var win = plug.Plugins.ToArray().FirstOrDefault(m => ((Type)m.GetType()).Name.ToLower() == this.Tag.ToString().ToLower());
                MethodInfo OnShowDlg = ((Type)win.GetType()).GetMethod("ShowSelf");
                Form cl = (Form)OnShowDlg.Invoke(win, null);
                cl.WindowState = FormWindowState.Maximized;
                cl.MdiParent = this;
                cl.Show();
                foreach (object obj in plug.Plugins)
                {

                    Type t = obj.GetType();
                    MethodInfo OnShowDlg = t.GetMethod("ShowSelf");
                    Control cl = (Control)OnShowDlg.Invoke(obj, null);

                   Control con = GetControlFromForm(t.Name, this);
                    if (con != null)
                    {
                        con.Controls.Add(cl);
                        cl.Dock = DockStyle.Fill;
                        isbreak = false;
                        con = null;
                    }

                } 

  • 相关阅读:
    介绍欧美同学会建言献策委员会||Center of China & Globalization
    snappy的性能测定 42qu.com
    清华大学信息检索组微博寻人闺蜜搜索
    第二届penny校园西瓜节总结
    包邮韩国SGP复古三星i9220手机皮套n7000手机壳Galaxy note保护套tmall.com天猫
    Lustre I/O性能特点与最佳实践 刘爱贵的专栏 博客频道 CSDN.NET
    请问广告这行入门都有哪些经典paper可以学习?
    tbgo: 金山软件稳健增长 $金山软件(03888)$ 金山的中报1个月... 雪球
    京东商城招聘java工程师
    统筹学_百度百科
  • 原文地址:https://www.cnblogs.com/keepsilence/p/2465923.html
Copyright © 2011-2022 走看看