1. 程式人生 > >C#如何載入程式執行目錄外的程式集

C#如何載入程式執行目錄外的程式集

我們的應用程式部署的時候,目錄結構一般不會只有執行程式的目錄這一個,我們可能在執行目錄下建子目錄,也可能使用System32目錄,也可能使用其它第三方的程式集。.Net程式集

首先會在GAC中搜索相應的版本,如果未找到則會應用程式配置檔案中找(如果配置),最後到應用程式所在的路徑搜尋。

如何可以將程式集部署的執行目錄的子目錄, 在app.config新增以下配置,其中probing的privatePath就是配置當前程式搜尋的子目錄

 <configuration>
  ... ...
 <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="Plugins;Libs"/>
    </assemblyBinding>
  </runtime>
 </configuration>

當然我們也可以更詳細的配置,不過似乎一般這麼用的很少,這裡可以指定程式集名稱、公鑰、文化,版本重定向等等資訊

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="myAssembly"
                              publicKeyToken="32ab4ba45e0a69a1"
                              culture="neutral" />
            <bindingRedirect oldVersion="1.0.0.0"
                             newVersion="2.0.0.0"/>
            <codeBase version="2.0.0.0"
                      href="http://www.litwareinc.com/myAssembly.dll"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

如何載入非執行目錄的程式集?也許有的人會想到反射,的確對應單獨的一個程式集我們可以直接呼叫使用 Assembly.LoadFile(@"XXX.dll");載入,再使用反射對其中的方法屬性進行調

用,但是如果這個程式集同時引用了其它的,非應用程式執行目錄下的程式集,這時就會出錯,這個問題該如何解決呢?

我曾嘗試用 Assembly.LoadFile(@"XXX.dll");載入那些依賴的程式集,但是沒有成功,呼叫繼續出錯。使用 AppDomain.CurrentDomain.GetAssemblies()檢視,所有的應用程式集都已經載入到了當前應用程式域,但是為什麼還是找不到依賴的哪些程式集呢?後來查詢未果,希望有高人能回答下。

最後使用了AppDomain.CurrentDomain.AssemblyResolve事件解決了以上問題,希望遇到同樣問題的同學們少走彎路,在程式初始化的時候新增監聽事件

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

在監聽的事件中遇到要載入額外的dll的時候,返回 Assembly.LoadFrom(strTempAssmbPath)即可
        Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            var strTempAssmbPath = "";
            if ("qrcsharp" == args.Name.Substring(0, args.Name.IndexOf(",")))
            {
                var systemFolder = Environment.GetFolderPath(Environment.SpecialFolder.System);
                strTempAssmbPath = System.IO.Path.Combine(systemFolder, "qrcsharp.dll");
            }
            return string.IsNullOrWhiteSpace(strTempAssmbPath) ? null : Assembly.LoadFrom(strTempAssmbPath);
        }

相關推薦

C#如何載入程式執行目錄程式

我們的應用程式部署的時候,目錄結構一般不會只有執行程式的目錄這一個,我們可能在執行目錄下建子目錄,也可能使用System32目錄,也可能使用其它第三方的程式集。.Net程式集 首先會在GAC中搜索相應的版本,如果未找到則會應用程式配置檔案中找(如果配置),最後到應用程式所在

C# 程式執行目錄,軟體開機自啟目錄

string exeDir = Application.ExecutablePath;// //string exeDir1 = System.IO.Directory.GetCurrentDirectory();

獲取被載入dll路徑和應用程式執行目錄

獲取程式路徑和獲取載入模組路徑 DWORD GetModuleFileName(HMODULE hModule,LPTSTR lpFilename,DWORD nSize); 函式引數說明: hModule HMODULE 裝載一個程式例項的控制代碼。如果該引數為NULL,

ctrl+c關閉多執行緒python程式

專案中經常需要用到多執行緒,如果一個python程式用了多執行緒,當子執行緒沒有結束時,用ctrl+c是關閉不了主執行緒的,這時候就只能用kill命令殺掉,這樣會很麻煩。 所以探討了下怎麼ctrl+C關閉多執行緒python程式,也在網上查了很多別人的做法,自己做了很多實驗,嘗試了很多種方法,總結得出一個能

C#構建多執行緒應用程式(4) —— 併發問題

在構建多執行緒的應用程式時,我們需要找到一種方式來控制多個執行緒對共享資源的同步訪問。System.Threading名稱空間提供了一些以同步為中心的型別。C#程式語言也提供了一個特別的關鍵字,它能在

程式執行時更改程式外觀

新建自己的VCL程式,在PROJECT>OPTIONS>Application>Appearance 下選擇好自己喜歡的幾個樣式 如下圖  然後按OK。 在視窗中放置PANNEL,頂部對齊;LISTBOX控制元件居中對齊;底部放置一個BUTTON按

教你如何獲得可執行程式執行目錄、可執行程式名、可執行程式字尾(C\C++)

很多童鞋可能遇見過這個問題。下面給大家講講哈,希望各位有用。 首先,我們應該明白main函式的引數是什麼意思。 int main(int argc, char **argv); 第一個引數說的是,argv中有多少個字串。第二個引數存放的是一些字串,這些字串是系統給出的。其

C++中用 GetModuleFileName()函式 獲得程式當前的執行目錄

//獲取當前程式所在路徑。 //蔡軍生 2007/12/05 QQ:9073204 深圳 void TestGetExePath(void) { // const int nBufSize = 512; TCHAR chBuf[nBufSi

C# 程式執行無法載入 C++ DLL“xxx.dll”: 找不到指定的模組

C# 編寫的web專案在釋出後將拷貝到伺服器上面,訪問系統時如下錯誤資訊: 針對所呼叫的dll為C++編寫的類庫,呼叫方式如下: [DllImport("xxxxxxxx.dll", Cha

linux下C開發多執行程式

轉:https://blog.csdn.net/lingfemg721/article/details/6574804   linux下用C開發多執行緒程式,Linux系統下的多執行緒遵循POSIX執行緒介面,稱為pthread。   #

Linux C 程式執行 shell 命令並獲取返回結果的方法

據說有統計資料表明,程式碼的缺陷率是一定的,與所使用的語言無關。Linux提供了很多的實用工具和指令碼,在程式中呼叫工具和指令碼,無疑可以簡化程式,從而降低程式碼的缺陷數目。Linux shell 指令碼也是一個強大的工具,我們可以根據需要編制指

C# TSC列印二維碼和條形碼(轉) C#呼叫dll提示"試圖載入格式不正確的程式"解決方法

效果圖   開發、使用環境說明 安裝TSC_7.3.8_M-3.exe印表機驅動,安裝時選擇對應的ttp 244 pro 將TSCLIB.dll複製到C:\Windows\system 驅動安裝說明     選擇下一步   &nbs

C++程式執行時間

#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<ctime> using

編寫一個程式,啟動三個執行緒,三個執行緒的名稱分別是 A,B,C; 每個執行緒將自己的名稱在螢幕上列印5遍,列印順序是ABCABC...

設定標誌位flag 當flag==1時,列印A 當flag==2時,列印B 當flag==3時,列印C 用count控制列印的次數,題目要求列印5遍,即15個字元 這裡的用notifyAll()的原因:是要把其餘兩個全都喚醒,因為如果用notify

JVM (二)--Java程式編譯、類載入執行

Java程式的編譯 Java程式的編譯是由Java原始碼編譯器來完成,流程圖如下: Java程式的執行 Java程式的編譯是由Java執行引擎來完成,流程圖如下:   Java程式碼編譯和執行的整個過程包含了以下三個重要的機制: Java原始

C# 程式執行中的流程控制

1、C#之流程控制語句:計算機程式執行的控制流程由三種基本的控制結構控制,即順序結構,選擇結構,迴圈結構。 1) 順序結構:從上到下,按照書寫順序執行每一條語句,不會發生跳躍。 程式碼段1; // 先執行程式碼段1 程式碼段2; // 接著執行程式碼段2 ... 2)選擇結構:對

C# WPF開機自啟動和只允許一個程式執行

本文出自:https://www.cnblogs.com/2186009311CFF/p/10024949.html 在App.xaml.cs填充一下內容,即可實現只允許一個執行,且不解鎖螢幕的情況下,重啟執行。 public partial class App : Application

如何在Visual C++下除錯執行C程式

  本文轉載自網際網路,如有侵權,請聯絡我及時刪除。謝謝。   從2008年4月開始,全國計算機等級考試將全面停止Turbo C2.0(簡稱TC)軟體的使用,所有參加二級C語言、三級資訊科技、網路技術和資料庫技術上機考試的考生,都要在Visual C++6.0(簡稱VC)環

C語言程式執行

vs2013編輯器c程式的執行一、啟動Microsoft Visual C++ 2013版、新建專案 。 檔案——> 新建——> 專案。 2.確定之後 彈出新建專案對話方塊。選擇模板——>Win32——>Win32控制檯應用程式——>

【OS學習筆記】十 真實模式:實現一個程式載入器-程式載入器如何將使用者程式載入到記憶體並執行

上一篇文章學習了以下內容: 用一種不同的分段方法,從另一個不同的的角度理解處理器的分段記憶體訪問機制 使用迴圈和條件轉移指令來優化主引導扇區程式碼 點選連結檢視上一篇文章:點選連結檢視 對於主引導扇區部分。大概前幾篇文章已經學的差不多了。現在是時候跳過主引