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.pswp.cn/news/252056.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252056.shtml
英文地址,請注明出處:http://en.pswp.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;。 注…