打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C#如何实现从内存中加载程序集
userphoto

2012.12.29

关注

C#如何实现从内存中加载程序集

2010-05-01  来自:csharpwin.com  字体大小:【  
  • 摘要:本文介绍C#如何实现从内存中加载程序集。为了动态的在内存中装载程序或程序集,我们以文件流的方式读取二进制文件,并将其以字节的形式保存在数组中

首先,为了动态的在内存中装载程序或程序集,我们以文件流的方式读取二进制文件,并将其以字节的形式保存在数组中,代码如下:
           

//动态加载插件

            String pluginFilePath = Path.GetDirectoryName(Application.ExecutablePath) +

                "\\plugins\\PluginLibrary.dll";

            FileStream fs = new FileStream(pluginFilePath, FileMode.Open);

            BinaryReader br = new BinaryReader(fs);

            byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length));

            fs.Close();

            br.Close();

 

 

 

 

然后,利用 Assembly 类的 Load 重载方法,以数组的形式加载该程序集。代码如下:
             Assembly assembly = Assembly.Load(bin);



动态加载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;
                }

            }

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
C# 利用反射根据类名创建类的实例对象
C#中动态加载和卸载DLL
把C#程序(含多个Dll)合并成一个Exe的超简单方法
C#项目将dll打包进exe中
关于appdomain, assembly, 进程,线程的概念体会
.Net core 的热插拔机制的深入探索,以及卸载问题求救指南.
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服