.net C#加载程序集外dll文件方法

发布时间 2023-04-18 17:49:23作者: xuanyuanhw

参考帖子:(20条消息) C#如何加载程序运行目录外的程序集_c# probing privatepath_Jlins的博客-CSDN博客

(20条消息) Assembly resolve(自定义加载指定目录的程序集)_assemblyresolve_Mr蹇的博客-CSDN博客

这里感谢作者提供的信息!

我们在做程序开发时,总会引用各种各样的dll,有时候不想把dll文件放到主程序同一目录下,而是放到指定目录多个程序共享它,这时候需要借助AppDomain.CurrentDomain.AssemblyResolve事件。

  1. Visual Studio中添加dll文件的引用,复制本地改为False。
  2. 在程序初始化时添加监视事件 AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); 
  3. 在监听事件中处理自己指定目录的dll,这里我把多个dll处理写在一个方法中了,按主程序使用dll的顺序依次加载
            static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
            {
                Dictionary<string, string> dicDll = new Dictionary<string, string>();
                dicDll.Add("LinqToExcel.dll", @"C:\Users\Public\Documents\Alpha_Resources\LinqToExcel.dll");
                dicDll.Add("MiniExcel.dll", @"C:\Users\Public\Documents\Alpha_Resources\MiniExcel.dll");
    
                if (string.IsNullOrWhiteSpace(args.Name))
                {
                    return null;
                }
    
                string dllName = args.Name.Split(',')[0] + ".dll";
    
                //判断是否已经加载过
                foreach (var itemAssm in AppDomain.CurrentDomain.GetAssemblies())
                {
                    if (dicDll.Keys.Contains(itemAssm.ManifestModule.Name))
                    {
                        return itemAssm;
                    }
                }
    
                //将文件以二进制方式读取到内存,此方法可解决文件被占用的问题
                byte[] buffer = System.IO.File.ReadAllBytes(dicDll[dllName]);
                //加载内存中的文件
                return Assembly.Load(buffer);
    
            }