最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

环球观天下!.net C#加载程序集外dll文件方法

来源:博客园


(资料图片仅供参考)

参考帖子:(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 dicDll = new Dictionary();            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);        }

关键词: