C#:把dll封入exe中方法

在这个事件中,可以重新为加载失败的程序集手动加载

如果你将dll作为资源文件打包的你的应用程序中(或者类库中)

就可以在硬盘加载失败的时候 从资源文件中加载对应的dll

就像这样:

 

class Program
{static Program(){        //这个绑定事件必须要在引用到TestLibrary1这个程序集的方法之前,注意是方法之前,不是语句之间,就算语句是在方法最后一行,在进入方法的时候就会加载程序集,如果这个时候没有绑定事件,则直接抛出异常,或者程序终止了AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;}static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args){//获取加载失败的程序集的全名var assName = new AssemblyName(args.Name).FullName;if (args.Name == "TestLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"){//读取资源using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ConsoleApplication5.TestLibrary1.dll")){var bytes = new byte[stream.Length];stream.Read(bytes, 0, (int)stream.Length);return Assembly.Load(bytes);//加载资源文件中的dll,代替加载失败的程序集}}throw new DllNotFoundException(assName);}//程序进入方法之前会加载程序集,当程序集加载失败,则会进入CurrentDomain_AssemblyResolve事件static void Main(string[] args){var test = new TestLibrary1.Test();test.Point();Console.ReadLine();}
}

这样就软件以一个exe单独运行了

以上都是我网上看来了...................


不过如果我有很多dll怎么办,总不至于每一个dll写一个分支吧?

所以我准备写一个通用的资源dll加载类

原理蛮简单的,主要是通过StackTrace类获取调用RegistDLL方法的对象,获取到对方的程序集

然后通过Assembly.GetManifestResourceNames()获取所有资源的名称

判断后缀名".dll"(这一步可以自由发挥),然后加载,以加载的程序集的名称为key保存到一个字典中

并绑定AppDomain.AssemblyResolve事件

在程序集加载失败时,从字典中查询同名程序集,如果有,直接从字典中加载

代码如下:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;namespace blqw
{/// <summary> 载入资源中的动态链接库(dll)文件/// </summary>static class LoadResourceDll{static Dictionary<string, Assembly> Dlls = new Dictionary<string, Assembly>();static Dictionary<string, object> Assemblies = new Dictionary<string, object>();static Assembly AssemblyResolve(object sender, ResolveEventArgs args){//程序集Assembly ass;//获取加载失败的程序集的全名var assName = new AssemblyName(args.Name).FullName;//判断Dlls集合中是否有已加载的同名程序集if (Dlls.TryGetValue(assName, out ass) && ass != null){Dlls[assName] = null;//如果有则置空并返回return ass;}else{throw new DllNotFoundException(assName);//否则抛出加载失败的异常}}/// <summary> 注册资源中的dll/// </summary>public static void RegistDLL(){//获取调用者的程序集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();foreach (var r in res){//如果是dll,则加载if (r.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)){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 (Dlls.ContainsKey(da.FullName)){continue;}Dlls[da.FullName] = da;}catch{//加载失败就算了...}}}}}
}LoadResourceDll

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P2685 [TJOI2012]桥

P2685 [TJOI2012]桥 思路&#xff1a; 先求出最短路&#xff1a; d1[u] : u 到 1 的最短路&#xff0c; d2[u] : u 到 n 的最短路 再求出一条从 1 到 n 的最短路链&#xff0c;然后从链上的每一个点出发dfs, 求出&#xff1a; l[u] : u 到 1 的最短路径过中和链的交点&#xf…

C#结构类型图

转载于:https://www.cnblogs.com/kangao/p/8674838.html

C# 全局钩子实现扫码枪获取信息

1.扫描枪获取数据原理基本相当于键盘数据&#xff0c;获取扫描枪扫描出来的数据&#xff0c;一般分为两种实现方式。 a&#xff09;文本框输入获取焦点&#xff0c;扫描后自动显示在文本框内。 b&#xff09;使用键盘钩子&#xff0c;勾取扫描枪虚拟按键&#xff0c;根据按键频…

Centos下安装mysql(二进制版)

Centos下安装mysql&#xff08;二进制版&#xff09; 1.下载安装包&#xff0c;选择相应的平台、版本&#xff0c;比如&#xff0c;选择64位Linux平台下的MySQL二进制包“Linux-Generic &#xff08;glibc 2.5&#xff09;&#xff08;x86&#xff0c;64-bit&#xff09;&#…

使用gradle多渠道打包

以友盟的多渠道打包为例&#xff0c;如果我们须要打包出例如以下渠道&#xff1a;UMENG, WANDOUJIA, YINGYONGBAO。 第一种方法。是须要创建文件的。我们在写完我们的代码之后&#xff0c;在app/src以下。分别创建和main同级目录的目录umeng, wandoujia, yingyongbao,这三个目录…

SMMS 2016 啟用深色主題

1、用文本類編輯器 打開C:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn\ManagementStudio目錄下的 ssms.pkgundef 2、去除// Remove Dark theme行以下的注釋 3、重新打開SMMS&#xff0c;如果還沒有出現“深色”主題&#xff0c;請執行第4點 4、打開powershell【…

四大步骤,彻底关闭Win10自动更新

尽管Win11已经发布了一段时间&#xff0c;但目前互联网上大部分电脑用户所使用的的操作系统仍是Win10&#xff0c;对于Win10&#xff0c;笔者相信大部分人应该都不陌生&#xff0c;作为目前市面上占比最高的电脑系统&#xff0c;Win10的许多功能和操作逻辑都十分优秀&#xff0…

LeetCode算法题-Repeated String Match(Java实现)

这是悦乐书的第289次更新&#xff0c;第307篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第156题&#xff08;顺位题号是686&#xff09;。给定两个字符串A和B&#xff0c;找到A必须重复的最小次数&#xff0c;使得B是它的子字符串。 如果没有这样的解决方案&a…

php

●转载于:https://www.cnblogs.com/volcanorao/p/8678104.html

Vs快捷键设置(可搭配Vim使用)

设置方式: 通过在Vs菜单栏的工具->选项->环境->键盘。 常用快捷键: 推荐键位编辑.转到定义Alt G切换标题代码文件Alt Q查看.向前导航Alt D查看.向后导航Alt A调试.调用堆栈Alt 7调试.监视1Alt 8调试.内存1Alt 9查看.查找符号结果Alt 1查看.错误列表Alt …

虚拟机windows7安装启动MYSQL5.7

一.环境 环境&#xff1a;虚拟机VMVare 系统&#xff1a;windows7旗舰版 MYSQL版本&#xff1a;mysql5.7.25 二.具体步骤 1.首先下载安装mysql5.7.25&#xff0c;这里用的是安装版的mysql&#xff0c;网上大多数都是推荐去官网下载&#xff0c;这里推荐的是清华大学开源镜像站…

故障转移架构的本质:数据中心的基础设施过剩

数据中心构成了全球互联基础设施的核心&#xff0c;我们称之为“云”。从根本上讲&#xff0c;云计算指的是基础设施从桌面计算&#xff08;文件和应用程序存储在计算机的本地硬盘上&#xff09;到在线计算&#xff08;文件和应用程序存储在可通过互联网远程访问的数据中心中&a…

CentOS启动Tomcat巨慢

在本地开发环境&#xff0c;应用正常启动。 在CentOS测试环境&#xff0c;应用启动速度也是正常的。 但是在阿里云的生产环境&#xff0c;tomcat启动超级慢&#xff0c;并且在最终打印出来以下内容&#xff1a; org.apache.catalina.util.SessionIdGenerator createSecureRando…

Oracle 存储过程

什么是存储过程&#xff1f;存储过程是一种命名的PL/SQL程序块&#xff0c;它是由一些T-SQL语句组成的代码块&#xff0c;这些T-SQL语句代码像一个方法一样实现一些功能&#xff08;对单表或多表的增删改查&#xff09;&#xff0c;可以有参数、输入输出参数&#xff0c;通常没…

查看Oracle 版本信息

select * from v$version;转载于:https://www.cnblogs.com/hanje/p/10614555.html

ubuntu上安装docker

在Ubuntu16.04上安装Docker Docker是一个开源的容器引擎&#xff0c;它有助于更快地交付产品。Docker可将应用程序和基础设施层隔离&#xff0c;并且将基础设施当作程序一样进行管理。使用Docker&#xff0c;可以更快地打包&#xff0c;测试以及部署应用程序&#xff0c;并可以…

字符串问题之 在有序但含有空的数组中查找字符串

尽可能使用二分查找 假设在 left right 之间查找 关键是mid处理过程 导致 left 跟 right 的改变 控制去哪里寻找 分如下情况&#xff1a; 若 mid处 不为空&#xff0c;并且 此处就是 str 那么记下 mid &#xff0c;同时把right-1 &#xff08;往左寻找&#xff09; 若…

Python_48re模块的sub方法

sub是替换的功能 sub(模型&#xff0c;替换为的字符&#xff0c;目标原字符串&#xff0c;替换次数) import re yuanchuan1qaz2wsx3edc4rfv5tgb new_strre.sub(\d,INTNUM,yuanchuan,2) #若果没有2表示默认替换所有的 print (new_str) #输出结果为&#xff1a;INTNUMqazINTNUMw…

个人笔记-vuex

个人笔记-vuex 最近想要沉淀下自己的知识体系&#xff0c;以前光看不记&#xff0c;当时记得&#xff0c;过段时间记忆就模糊了&#xff0c;好脑子不如烂笔头&#xff0c;古人诚不欺我&#xff0c;所以现在决定给用自己的语言方式来给自己记个笔记。 vuex vuex 有什么好讲的呢&…

常用模块之hashlib,configparser,logging模块

常用模块二 hashlib模块 hashlib提供了常见的摘要算法&#xff0c;如md5和sha1等等。 那么什么是摘要算法呢?摘要算法又称为哈希算法、散列算法。它通过一个函数&#xff0c;把任意长度的数据转换为一个长度固定的数据串&#xff08;通常用16进制的字符串表示&#xff09;。 注…