载入资源中的动态链接库(dll)文件
来源:互联网 发布:淘宝上卖aj高仿的店铺 编辑:程序博客网 时间:2024/05/21 06:15
//1.将dll添加至项目资源文件夹,并 设置为"嵌入资源"
//2.添加引用,引用该资源目录下的dll,设置"本地复制为:False"即可(为了代码开发不报错)
//3.正常编写代码即可.
using System;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using System.Reflection;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks;namespace MouseTest{ /// <summary> 载入资源中的动态链接库(dll)文件 /// </summary> public static class LoadResourceDll { /// <summary> 已加载DLL /// </summary> private static Dictionary<string, Assembly> LoadedDlls = new Dictionary<string, Assembly>(); /// <summary> 已处理程序集 /// </summary> private static Dictionary<string, object> Assemblies = new Dictionary<string, object>(); /// <summary> 在对程序集解释失败时触发 /// </summary> /// <param name="sender">AppDomain</param> /// <param name="args">事件参数</param> private static Assembly AssemblyResolve(object sender, ResolveEventArgs args) { //程序集 Assembly ass; //获取加载失败的程序集的全名 var assName = new AssemblyName(args.Name).FullName; //判断Dlls集合中是否有已加载的同名程序集 if (LoadedDlls.TryGetValue(assName, out ass) && ass != null) { LoadedDlls[assName] = null;//如果有则置空并返回 return ass; } else { throw new DllNotFoundException(assName);//否则抛出加载失败的异常 } } /// <summary> 注册资源中的dll /// </summary> /// <param name="pattern">*表示连续的未知字符,_表示单个未知字符,如*.dll</param> public static void RegistDLL(string pattern = "*.dll") { System.IO.Directory.GetFiles("", ""); //获取调用者的程序集 var ass = new StackTrace(0).GetFrame(1).GetMethod().Module.Assembly; //判断程序集是否已经处理 if (Assemblies.ContainsKey(ass.FullName)) { return; } //程序集加入已处理集合 Assemblies.Add(ass.FullName, null); //绑定程序集加载失败事件(这里我测试了,就算重复绑也是没关系的) AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolve; //获取所有资源文件文件名 var res = ass.GetManifestResourceNames(); var regex = new Regex("^" + pattern.Replace(".", "\\.").Replace("*", ".*").Replace("_", ".") + "$", RegexOptions.IgnoreCase); foreach (var r in res) { //如果是dll,则加载 if (regex.IsMatch(r)) { try { var s = ass.GetManifestResourceStream(r); var bts = new byte[s.Length]; s.Read(bts, 0, (int)s.Length); var da = Assembly.Load(bts); //判断是否已经加载 if (LoadedDlls.ContainsKey(da.FullName)) { continue; } LoadedDlls[da.FullName] = da; } catch { //加载失败就算了... } } } } }}
0 0
- 载入资源中的动态链接库(dll)文件
- LoadResourceDll类,载入资源中的动态链接库(dll)文件,把DLL打包到EXE文件里面
- 动态加载 DLL 中的资源文件
- 动态载入动态库(dll)
- 动态链接库文件DLL详解
- VB编写.DLL动态链接库文件
- 动态链接库dll文件的使用
- 动态链接库(dll)文件解析
- dll动态链接库文件编写
- 如何使用动态链接库中的资源
- 如何使用动态链接库中的资源
- 如何使用动态链接库中的资源
- VC++动态链接库编程之纯资源DLL
- lib静态链接库,dll动态链接库,h文件
- VC 使用msxml6.dll动态链接库中的函数读写XML文件
- VC 使用msxml6.dll动态链接库中的函数读写XML文件
- 动态链接库 (DLL)
- 动态链接库DLL
- C#之绘制三角形
- Underscore简介
- Oracle中过程和函数
- Activity详解(二)
- java中,字符串String类型的""和null值的区别
- 载入资源中的动态链接库(dll)文件
- Oracle解决Ora-01653无法扩展表空间
- windows安装hadoop
- Python写的一个优美的下载器
- ubuntu无法打开software-center
- 最新Chrome离线安装包[官网]
- 6. ZigZag Conversion
- Boot Camp 驱动
- 文章标题