.NET應(yīng)用程序集DLL與EXE工作機(jī)制及原理介紹
.NET 中的程序集是什么?
根據(jù) MSDN 的說(shuō)法,程序集是 .NET Framework 應(yīng)用程序的構(gòu)建基塊;它們構(gòu)成了部署的基本單位。簡(jiǎn)單地說(shuō),我們可以說(shuō),程序集只不過(guò)是一個(gè)預(yù)編譯的 .NET 代碼,可以由 CLR(通用語(yǔ)言運(yùn)行時(shí))運(yùn)行。
讓我們以一個(gè)示例來(lái)理解上述定義。為了理解這一點(diǎn),讓我們創(chuàng)建一個(gè)名稱為 MyConsoleApp 的簡(jiǎn)單控制臺(tái)應(yīng)用程序。創(chuàng)建控制臺(tái)應(yīng)用程序后,請(qǐng)修改程序類,如下所示。
現(xiàn)在,如果您右鍵單擊項(xiàng)目并單擊文件資源管理器中的"打開文件夾",您將發(fā)現(xiàn)許多內(nèi)容(源代碼,即 Program.cs 類文件、配置文件(即應(yīng)用程序、包含 AssemblyInfo.cs 類文件等的屬性文件夾),如下圖所示。
但是,當(dāng)您構(gòu)建應(yīng)用程序時(shí),它會(huì)將整個(gè)事情放入單個(gè) EXE 中,如下圖所示。您可以在 bin => 調(diào)試文件夾下找到此文件。
您可以復(fù)制這個(gè)程序集,即 MyConsoleApp.exe,并把它放在計(jì)算機(jī)的任何地方,從那里你可以運(yùn)行它。
因此,程序集只不過(guò)是一個(gè)部署單元,或者它是 CLR 可以執(zhí)行的預(yù)編譯代碼塊。為了更好地了解,請(qǐng)看下圖。
.NET 框架中的程序集類型
在 .NET 框架中,有兩種類型的程序集。它們?nèi)缦滤荆?/p>
1.EXE(可執(zhí)行)
2.DLL(動(dòng)態(tài)鏈接庫(kù))
在 .NET 框架中,當(dāng)我們編譯控制臺(tái)應(yīng)用程序或 Windows 應(yīng)用程序時(shí),它會(huì)生成 EXE,而當(dāng)我們編譯類庫(kù)項(xiàng)目或 ASP.NET Web 應(yīng)用程序時(shí),它會(huì)生成 DLL。In.NET框架中,EXE 和 DLL 都稱為程序集。
在 .NET 框架中了解 DLL 和 EXE
上面已經(jīng)創(chuàng)建了一個(gè)控制臺(tái)應(yīng)用程序,并且我們已經(jīng)看到它創(chuàng)建了一個(gè) EXE。讓我們看看 DLL 的示例。
為了創(chuàng)建 DLL,讓我們將類庫(kù)項(xiàng)目添加到名稱為 MyClassLibrary 的同一解決方案中。
創(chuàng)建類庫(kù)項(xiàng)目后,默認(rèn)情況下,它將創(chuàng)建一個(gè)名稱為 Class1 的類文件, 如下所示。
因此,現(xiàn)在我們的解決方案包含兩個(gè)項(xiàng)目。一個(gè)是控制臺(tái)應(yīng)用程序,另一個(gè)是類庫(kù)項(xiàng)目,如下所示。
現(xiàn)在,生成解決方案,您應(yīng)該在自己的 bin => Debug 文件夾中獲得預(yù)期中的程序集。現(xiàn)在,你想到的問(wèn)題是DLL和EXE有什么區(qū)別?
.NET 框架中的DLL和EXE有什么區(qū)別?
EXE 在其自己的地址空間或自己的內(nèi)存空間中運(yùn)行。如果您雙擊 MyConsoleApp EXE,那么您將獲得以下輸出。現(xiàn)在,這個(gè)程序在它自己的內(nèi)存空間中耗盡了。
如果不關(guān)閉此窗口,再次,如果您雙擊 MyConsoleApp EXE,它將再次運(yùn)行,并顯示相同的輸出。
這是因?yàn)楝F(xiàn)在,兩個(gè) EXE 都在自己的內(nèi)存空間中運(yùn)行。您需要記住的是 EXE 是一個(gè)可執(zhí)行文件,可以作為應(yīng)用程序本身運(yùn)行。
那么來(lái)到 DLL,它不能像EXE那樣自行運(yùn)行。這意味著MyClassLibrary. dll不能由自己調(diào)用或運(yùn)行。它需要一個(gè)要調(diào)用它的消費(fèi)者。
因此,DLL 在其他內(nèi)存空間內(nèi)運(yùn)行。其他內(nèi)存空間可以是控制臺(tái)、窗口應(yīng)用程序或 Web 應(yīng)用程序,它們應(yīng)有自己的內(nèi)存空間。
例如,可以從控制臺(tái)應(yīng)用程序調(diào)用 DLL。我們有一個(gè)名為 MyConsoleApp 的控制臺(tái), 讓我們看看如何從這個(gè)控制臺(tái)應(yīng)用程序調(diào)用 MyClassLibrary. dll 。
為了在 MyConsoleApp 中使用 MyclassLibrary. dll, 首先, 您需要引用該Dll。添加對(duì) MyClassLibrary DLL 的引用后,請(qǐng)修改控制臺(tái)應(yīng)用程序的程序類,如下所示。
現(xiàn)在,運(yùn)行應(yīng)用程序,您應(yīng)該會(huì)看到以下輸出。在這里,MyClassLibrary DLL 在 MyConsoleApp 地址空間內(nèi)運(yùn)行。
因此,簡(jiǎn)言之,它們之間的區(qū)別在于EXE是一個(gè)可執(zhí)行文件,可以作為應(yīng)用程序本身運(yùn)行,
而DLL通常由EXE或其他DLL使用,我們無(wú)法直接運(yùn)行或執(zhí)行 DLL。
現(xiàn)在,這個(gè)問(wèn)題應(yīng)該想到為什么我們需要DLL,因?yàn)樗皇亲约赫{(diào)用的。DLL 背后的原因是可再使用性。
假設(shè)您在許多應(yīng)用程序中需要一些類、邏輯或其他內(nèi)容,然后只需將這些類、邏輯放入DLL中,并在需要的地方引用該DLL。
到此這篇關(guān)于.NET應(yīng)用程序集DLL與EXE工作機(jī)制的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
在ASP.NET 2.0中操作數(shù)據(jù)之二十四:分頁(yè)和排序報(bào)表數(shù)據(jù)
本文主要介紹ASP.NET 2.0中使用GirdView控件呈現(xiàn)數(shù)據(jù)時(shí)如何實(shí)現(xiàn)分頁(yè)和排序功能的,希望對(duì)大家有所幫助。2016-05-05解讀ASP.NET 5 & MVC6系列教程(4):核心技術(shù)與環(huán)境配置
這篇文章主要介紹了ASP.NET 5 核心技術(shù)與環(huán)境配置,需要的朋友可以參考下2016-06-06從ASP過(guò)渡到ASP.net遺留的二十個(gè)積習(xí)
從ASP過(guò)渡到ASP.net遺留的二十個(gè)積習(xí)2006-10-10Mac中體驗(yàn)ASP.NET 5 beta2的K gen代碼生成
這篇文章主要介紹了Mac中體驗(yàn)ASP.NET 5 beta2的K gen代碼生成,需要的朋友可以參考一下。2016-06-06使用.Net6中的WebApplication打造最小API
本文詳細(xì)講解了使用.Net6中的WebApplication打造最小API,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12ASP.NET程序中用Repeater實(shí)現(xiàn)分頁(yè)
ASP.NET程序中用Repeater實(shí)現(xiàn)分頁(yè)...2006-10-10ExecuteReader(),ExecuteNonQuery(),ExecuteScalar(),ExecuteXml
ExecuteReader(),ExecuteNonQuery(),ExecuteScalar(),ExecuteXmlReader()之間的區(qū)別...2006-10-10NopCommerce架構(gòu)分析之(六)自定義RazorViewEngine和WebViewPage
本文對(duì)NopCommerce的后臺(tái)分離技術(shù)做簡(jiǎn)單的探討。NopCommerce通過(guò)自定義視圖引擎,重寫了VirtualPathProviderViewEngine類的CreateView、CreatePartialView、FindView、FindPartialView方法,添加自定義的視圖搜索路徑來(lái)實(shí)現(xiàn)后臺(tái)分離。2016-04-04