亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中怎么裝載應用程序集

發布時間:2020-12-08 15:01:30 來源:億速云 閱讀:192 作者:Leah 欄目:開發技術

本篇文章為大家展示了C#中怎么裝載應用程序集,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

實現方法如下

class Program
{
 static void Main(string[] args)
 {
 int a = int.Parse(Console.ReadLine());
 int b = int.Parse(Console.ReadLine());
 Console.WriteLine("A + B = " + Add(a, b));
 }

 private static int Add(int a, int b)
 {
 var calculator = new Lib1.Calculator();
 return calculator.Sum(a, b);
 }
}

在Lib1中:

public class Calculator
{
 public int Sum(int a, int b)
 {
 return a + b;
 }
}

輸入Main方法時,尚未加載Lib1程序集。但是,在輸入Add方法時,CLR嘗試解析Calculator類型,找出它在引用的程序集Lib1中,然后嘗試加載該程序集。

.NET中的程序集綁定

當CLR需要加載程序集時,邏輯實際上比在Bin文件夾中查找要復雜一些。這是執行的實際邏輯(有關詳細說明,請參見Microsoft文檔[1]):

1.根據配置文件(app.config或web.config)確定需要加載的程序集的版本。該配置文件的名稱為(在生成之后) [executable name].exe.config或web.config。綁定重定向在這里發揮了作用(稍后會詳細介紹)。

2.查看程序集是否已加載。如果加載了其他版本,則將拋出FileLoadException,除非它是一個可以同時加載多個版本的強命名程序集。

3.如果它是強名稱程序集,請檢查全局程序集緩存[2](GAC)。GAC是機器上共享多個應用程序部件的地方。如果需要的話,程序集會緩存。它只能存儲強命名程序集。它可以存儲同一程序集的不同版本。您可以使用gacutil.exe[3]自己將其安裝到GAC 。

4.如果它是一個強名稱的程序集,并且配置文件包含<codeBase>節點,那么它將檢查那里的程序集位置。如果該<codeBase>節點存在并且找不到程序集,FileNotFoundException則將引發a。

5.根據啟發式算法檢查程序集DLL或EXE。此過程稱為“探測”。算法如下:

1.檢查文件夾[application base] / [assembly name].dll。應用程序庫是應用程序可執行文件所在的位置。通常,您的Bin \ Debug或Bin \ Release文件夾。
2.檢查一下 [application base] / [assembly name] / [assembly name].dll
3.如果為引用的程序集指定了區域性信息,則僅檢查以下目錄: [application base] / [culture] / [assembly name].dll [application base] / [culture] / [assembly name] / [assembly name].dll
4.如果該<probing>節點存在于配置文件中,則它將在該privatePath節點的屬性指定的文件夾中查找程序集。

他們為什么要使所有事情變得如此困難,對嗎?

實際上,這種邏輯非常有助于我們發展,而不會使事情變得困難。它的存在是為了實現一些重要目標:

&#8226;為了確保您引用的是特定的程序集和版本,則將加載該確切版本。否則,將引發異常。而且,如果您知道自己在做什么,則可以在配置文件中指定覆蓋規則(綁定重定向)。

&#8226;為了靈活地在您要加載的程序集中進行。例如,如果要根據不同的區域性(語言)加載不同的程序集,則可以輕松地做到這一點。或者,如果您要根據客戶配置加載不同的程序集,那也可以。

&#8226;為了安全起見,我們使用了全稱的程序集。他們確保您不能“偽造”程序集。例如,如果某個進程希望加載Lib1 v4.5,那么您將無法加載具有相同名稱和版本的惡意軟件程序集。加載時會引發異常。這就是為什么在計算機上所有進程都共享的GAC只接受強名稱程序集的原因。

在大多數應用程序中,您無需記住程序集加載和探測的復雜邏輯。您無需了解或考慮GAC,全名程序集或操作配置文件。

您幾乎根本不需要考慮庫的版本,因為可能的沖突通過稱為“綁定重定向”的機制自動解決了。

綁定重定向

如果有一件事對于了解這筆交易非常重要,那就是綁定重定向。能夠告訴運行時它將實際加載哪個版本,而不管其引用的版本如何。

這是一個示例:您的流程有兩個項目(模塊):項目A和項目B。項目A引用log4net.dll v1.1,項目B引用log4net.dll v1.2。兩個log4net DLL文件都復制到輸出文件夾,但是只能有一個log4net.dll文件。

假設復制到輸出文件夾的文件是log4net.dll v1.2。假設到達的第一個代碼是Project A中的代碼,該代碼引用了log4net v1.1。運行時將在輸出文件夾中查找,找到不同版本的log4net,并失敗FileLoadException。

還有另一種可能。假設首先執行了項目B中的代碼,并且在嘗試使用log4net時,它成功加載了log4net.dll v1.2。片刻之后,Project A中的代碼將嘗試使用log4net v1.1,請參見該程序集已經加載了其他版本,并拋出FileLoadException。

如果您知道哪個log4net版本將在輸出文件夾中,在這種情況下可以做的就是告訴運行時應該使用哪個版本。只需app.config在該runtime部分的文件中添加以下幾行:

<&#63;xml version="1.0" encoding="utf-8" &#63;>
<configuration>
 ...
 <runtime>
 ...
 <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
 <dependentAssembly>
 <assemblyIdentity name="log4net" 
    publicKeyToken="669e0ddf0bb1aa2a" culture="neutral" />
 <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="1.2.0" />
 </dependentAssembly>
 </assemblyBinding>
 </runtime>
 ...
</configuration>

這意味著,只要運行時想綁定到版本范圍為0.0.0.0to的程序集log4net 5.0.0.0,它就會嘗試綁定到version 1.2.0。

實際上,您不必手動添加這些重定向,因為它們是自動添加的。如果轉到啟動項目的“屬性”,則會看到以下設置:

C#中怎么裝載應用程序集

默認情況下選中此選項。它會自動檢測版本沖突并在.config文件中生成綁定重定向。

當問題開始發生時

乍一看,綁定重定向可能看起來像是對所有問題的答案,但事實并非如此。使用綁定重定向時,基本上使用的庫版本與預期不同。如果刪除方法怎么辦?或方法的簽名已更改?在這種情況下,調用該方法時,程序將因運行時錯誤而失敗。畢竟,創建版本是有原因的。

如果確實存在此類問題,則有解決方法。查看我的文章:如何解決.NET引用和NuGet軟件包版本沖突[4]。

故障排除

當您有一個FileLoadException或類似的東西時,我建議做的第一件事是查看Visual Studio中的“模塊”窗口。在這里,您將看到所有已加載的模塊,并確定您要加載的程序集是否已加載,使用哪個版本以及從哪個路徑加載。

除此之外,您還可以查看程序集綁定日志,也稱為融合日志。這些日志將顯示在程序集綁定嘗試過程中到底發生了什么。您將看到運行時查找的程序集版本,運行時查找的文件夾以及故障點。

有幾種查看融合日志的方法。首先,您必須啟用它們,因為默認情況下它們是禁用的。您可以通過將HKLM\Software\Microsoft\Fusion\ForceLog值設置為1并將HKLM\Software\Microsoft\Fusion\LogPath值設置為來在注冊表中手動啟用它們C:\FusionLogs。日志將自動出現。或者,您可以使用Fusion Log Viewer,該軟件應以方式安裝在PC上fuslogvw.exe。我建議使用“一切窗口”搜索之[5]類的程序來查找它。確保以管理員權限運行融合日志查看器,以便能夠啟用和禁用日志。最近更流行的一種更現代的工具是Fusion ++[6]。

上述內容就是C#中怎么裝載應用程序集,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

英超| 犍为县| 衢州市| 页游| 武山县| 若羌县| 黄山市| 鄂温| 梅河口市| 油尖旺区| 渑池县| 钟山县| 温宿县| 岳西县| 榕江县| 新晃| 涿州市| 房山区| 朝阳区| 西华县| 增城市| 濮阳县| 长宁区| 南通市| 论坛| 宜良县| 佛冈县| 昆明市| 济源市| 泸溪县| 柘城县| 明星| 广元市| 宜章县| 英吉沙县| 措美县| 吉林省| 盐津县| 通榆县| 七台河市| 雷州市|