(资料图片仅供参考)
参考帖子:(20条消息) C#如何加载程序运行目录外的程序集_c# probing privatepath_Jlins的博客-CSDN博客
(20条消息) Assembly resolve(自定义加载指定目录的程序集)_assemblyresolve_Mr蹇的博客-CSDN博客
这里感谢作者提供的信息!
我们在做程序开发时,总会引用各种各样的dll,有时候不想把dll文件放到主程序同一目录下,而是放到指定目录多个程序共享它,这时候需要借助AppDomain.CurrentDomain.AssemblyResolve事件。
- Visual Studio中添加dll文件的引用,复制本地改为False。
- 在程序初始化时添加监视事件AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
- 在监听事件中处理自己指定目录的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); }