什麼是 DLL ?

文章翻譯 文章翻譯
文章編號: 815065 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

本文將告訴您哪些動態連結程式庫 (DLL) 是和各種問題當您使用 DLL 時, 可能會發生

然後, 本文告訴您開發您自己的 DLL 時, 您應考慮到一些進階的問題。 本文說明動態連結方法, DLL 相依性, DLL 進入點, 在描述哪些 DLL 是, 匯出 DLL 函式和疑難排解工具 DLL

這份文件會完成以高階比較對 Microsoft . NET Framework 組件的 DLL。

INTRODUCTION

適用於 Microsoft Windows 作業系統, 」 適用於 > 一節中所列, 大部分的作業系統功能是由動態連結程式庫 (DLL)。 由 DLL, 除此之外當您在其中一個的 Windows 作業系統, 執行程式大部分的程式功能可能會來提供。 舉例來說, 某些程式可能會包含許多不同的模組, 並且每個模組的程式會包含並分佈在 DLL。

使用的 DLL 可協助升級的程式碼、 程式碼重複使用、 有效率的記憶體使用量, modularization, 減少磁碟空間。 因此, 作業系統及程式載入速度較快, 執行速度, 並佔用較少的磁碟空間在電腦上。

當某個程式使用一個 DLL, 被呼叫的相依性的問題可能會產生沒有要執行程式。 當某個程式使用一個 DLL, 建立相依性。 如果另一個程式會覆寫並中斷此相依性, 原始程式可能未成功執行。

在引入的 Microsoft . NET Framework, 大部分的相依性問題已經被排除藉由使用組件。

其他相關資訊

什麼是 DLL ?

DLL 是程式庫, 其中包含程式碼和所可以是使用由多個程式在同一時間資料。 例如, 在 Windows 作業系統, Comdlg32 DLL 執行一般相關函式 ] 對話方塊 因此, 每個程式可以使用這個 DLL 來實作的 開啟舊檔 ] 對話方塊中所包含功能。 這有助於提升程式碼重複使用及有效率的記憶體使用量。

藉由使用一個 DLL, 程式可分割成個別的元件模組化。 舉例來說, 會計程式可能會是銷售由模組。 每個模組到主要程式可以載入在 Run Time 如果安裝了該模組。 由於模組是分開, 載入時間的程式並快, 要求該功能時, 只載入模組。

除此之外, 更新程式是容易套用至每個模組, 而不會影響其他部分的程式。 例如, 您可能會有一個發薪程式, 並變更每一年的稅率。 當這些變更將會隔離至 DLL, 可以套用的更新程式, 而不需要來建立或重新安裝整個程式。

下列清單描述一些的 DLL 為在 Windows 作業系統中實作的檔案:
  • ActiveX 控制項 (. ocx) 檔案
    ActiveX 控制項的範例是行事曆控制項, 可讓您從行事曆中選取一個日期。
  • 控制台 ] (cpl) 檔案
    cpl 檔案的範例是一個項目是位於 [ 控制台 ] 中。 每個項目都是特定的 DLL。
  • 裝置驅動程式 (drv) 檔案
    範例的裝置驅動程式是印表機驅動程式, 以控制列印至印表機。

DLL 優點

下列清單描述部分的優點當程式使用 DLL 所提供:
  • 使用較少的資源
    當多個程式使用相同的媒體櫃的函式, DLL 可以減少重複的程式碼, 會在磁碟上及實體記憶體中載入。 這會大幅影響效能的執行在前景, 不只是程式還 Windows 作業系統上正在執行的其他程式。
  • 模組化結構升級
    DLL 有助於提升開發模組化的程式。 這可協助您開發大型的程式需要有多個語言版本或需要模組化結構的程式。 範例的模組化的程式是帳戶程式有許多可在 Run Time 動態載入的模組。
  • 簡化部署和安裝
    當函式在 DLL 內需要的更新程式或修正程式, 部署和安裝的 DLL 不需要程式, 以與 DLL 重新連結。 除此之外, 如果多個程式使用同一個 DLL, 多個程式將所有獲益更新或修正程式。 當您使用協力廠商 DLL, 定期更新或修正這個問題的發生原因, 是更頻繁地。

DLL 相依性

當在另一個 DLL, 某個程式或 DLL 使用 DLL 函式會建立相依性。 因此, 程式不再是獨立 (Self - Contained), 並程式是否中斷相依性可能會遇到問題。 舉例來說, 如果發生下列動作的其中一個程式可能無法執行:
  • 相依 DLL 會升級為新版本。
  • 相依 DLL 是固定的。
  • 覆寫以舊版的相依 DLL。
  • 從電腦中移除相依 DLL。
這些動作通常稱為 DLL 衝突。 如果是回溯相容性, 不會強制執行該程式可能未成功執行。

下列清單說明變更具有已介紹在 Microsoft Windows 2000 以及在更新版本 Windows 作業系統, 以協助減少相依性問題:
  • Windows 檔案保護
    在 Windows 檔案保護, 作業系統會防止系統 DLL 無法更新或未經授權的代理程式被刪除。 因此, 當程式安裝嘗試先移除或更新 DLL 是定義為系統 DLL, Windows 檔案保護會尋找有效數位簽章。
  • 私密 DLL
    私密 DLL 可讓您分辨出某個程式從變更會對私人共用 DLL DLL 使用版本特定資訊或空白 . local 檔來強制是供程式使用 DLL 的版本。 若要使用私密 DLL, 在程式根資料夾找到您的 DLL。 然後, 對於新程式, 將版本 - 特定資訊加入至 DLL。 對於舊程式, 使用空 . local 檔案。 告訴作業系統要使用私密 DLL 位於程式根資料夾中的每個方法。

DLL 疑難排解工具

有數種工具可用來協助您疑難排解 DLL 問題。 下列工具是一些的這些工具。

Dependency Walker

Dependency Walker 工具可以遞迴地 scan for 由程式所使用所有相依 DLL。 當您在 Dependency Walker, 開啟某個程式 Dependency Walker 會執行下列檢查:
  • Dependency Walker 會檢查是否有遺漏 DLL。
  • Dependency Walker 會檢查是否有程式檔或 DLL, 是無效。
  • Dependency Walker 檢查, 函式匯入和匯出函式符合項目。
  • Dependency Walker 會檢查是否有循環相依性錯誤。
  • Dependency Walker 會檢查是否有模組, 是無效的, 因為模組是針對不同作業系統。
您可以藉由使用 Dependency Walker, 文件, 程式會使用所有 DLL。 這可能有助於防止並修正 DLL, 可能在未來發生的問題。 當您安裝 Microsoft Visual Studio 6.0 Dependency Walker 位於下列目錄中:
\Program Files \Microsoft Visual Studio\Common\Tools 磁碟機

DLL 萬用 [ 規劃求解 ] 問題

DLL 通用問題 [ 規劃求解 ] (DUPS) 工具是用來稽核、 比較, 文件, 和顯示 DLL 資訊 下列清單描述構成 DUPS 工具公用程式:
  • Dlister.exe
    這個公用程式會列舉電腦上的所有 DLL 並記錄至資料庫檔案到文字檔案或資訊。
  • Dcomp.exe
    這個公用程式比較兩個文字檔中所列之 DLL 並且產生包含差異第三個文字檔。
  • Dtxt2DB.exe
    此公用程式會載入藉由使用 Dlister.exe 公用程式和 Dcomp.exe 到 dllHell 資料庫公用程式建立的文字檔。
  • DlgDtxt2DB.exe
    這個公用程式提供 Dtxt2DB.exe 公用程式的圖形化使用者介面 (GUI) 版本。
如需 DUPS 工具, 請按一下下列文件編號, 檢視 「 Microsoft 知識庫 」 中的文件中的文件:
247957 使用 DUPS.exe 來解決 DLL 相容性問題

DLL [ 說明 ] 資料庫

DLL [ 說明 ] 資料庫可協助您找出特定版本的 DLL 已安裝由 Microsoft 軟體產品。 如需資料庫, DLL [ 說明 ] 資訊請造訪下列 Microsoft 網站:
http://support.microsoft.com/dllhelp/

DLL 開發

本節說明問題和需求, 您應考慮到開發您自己的 DLL 時。

類型的 DLL

當您載入 DLL 的應用程式中, 連結的兩種方法讓您呼叫匯出 DLL 函式。 連結的兩個方法是載入時間 - 動態連結和 Run - Time 動態連結。
載入時間 - 動態連結
在載入時間 - 動態連結, 應用程式進行明確呼叫匯出 DLL 函式類似本機函式。 若要使用動態載入時間 - 連結, 當您編譯和連結應用程式提供標頭 (Header File, . h) 檔和一個匯入程式庫 (. lib) 檔。 當您這麼做, 連結器將向系統提供所需來載入 DLL 並在載入時間解決匯出 DLL 函式位置資訊。
Run - Time 動態連結
在 Run - Time 動態連結, 的應用程式呼叫 LoadLibrary 函式或要在 Run Time 載入 DLL LoadLibraryEx 函數。 在成功地載入該 DLL, 使用 GetProcAddress 函式來取得, 您要呼叫匯出 DLL 函式的位址。 當您使用 Run - Time 動態連結, 您不需要的匯入程式庫檔。

下列清單說明何時該使用 Run - Time 動態連結時, 載入時間 - 使用動態連結應用程式準則:
  • 啟動效能
    如果應用程式效能的初始啟動期間很重要, 使用 Run - Time 動態連結。
  • 簡易的使用
    在載入時間 - 動態連結, 匯出 DLL 函式就像是本機函式。 這樣可以讓您可以呼叫這些函式。
  • 應用程式邏輯
    在 Run - Time 動態連結, 應用程式可以分支到載入不同的模組所需。 當您開發多個語言版本這很重要。

DLL 進入點

當您建立一個 DLL, 您可以選擇性地指定的進入點函式。 當處理序或執行緒附加至該 DLL 本身會呼叫進入點函式或從 DLL 本身卸離。 您可以使用到起始資料結構或到損毀資料結構所需由 DLL 進入點函式。 除此之外, 如果應用程式是多執行緒, 您可以使用儲存執行緒本機區 (Thread Local Storage, TLS) 來配置記憶體是專屬於進入點函式中的每個執行緒。 下列程式碼是 DLL 進入點函式的範例。
BOOL APIENTRY DllMain(
HANDLE hModule,	// Handle to DLL module
	DWORD ul_reason_for_call,	// Reason for calling function
	LPVOID lpReserved ) // Reserved
{
	switch ( ul_reason_for_call )
	{
		case DLL_PROCESS_ATTACHED:
		// A process is loading the DLL.
		break;
		case DLL_THREAD_ATTACHED:
		// A process is creating a new thread.
		break;
		case DLL_THREAD_DETACH:
		// A thread exits normally.
		break;
		case DLL_PROCESS_DETACH:
		// A process unloads the DLL.
		break;
	}
	return TRUE;
}
當進入點函式傳回 FALSE 值, 應用程式不會啟動如果您使用載入時間 - 動態連結。 如果您正在使用 Run - Time 動態連結, 只有個別的 DLL 將不會載入。

進入點函式應該只執行簡單的初始設定工作並不應該呼叫任何其他 DLL 載入或終止函式。 舉例來說, 在進入點函式, 您應該不直接或間接呼叫 LoadLibrary 函式或 LoadLibraryEx 函式。 正在終止處理序時, 除此之外, 不應呼叫 FreeLibrary 函式。

注意 在多執行緒應用程式, 確定是同步 DLL 全域資料的存取權 (執行緒安全), 以避免資料可能損毀 (執行緒安全), 以避免可能資料損毀。 如果要執行這項操作, 使用 TLS 來提供唯一資料為每個執行緒。

匯出 DLL 函式

來匯出 DLL 函式, 您可以在匯出 DLL 函式加入函式關鍵字或建立模組定義 (. def) 檔列出匯出 DLL 函式。

若要使用函式關鍵字, 您必須宣告每個在您想要使用下列關鍵字來匯出函式:
__declspec (dllexport)
您若要在應用程式, 使用匯出 DLL 函式必須宣告每個函式, 您要匯入以下面關鍵字:
__declspec (dllimport)
通常, 您會使用一個標頭檔具有 define 陳述式和 ifdef 陳述式來區隔匯出陳述式和匯入陳述式。

您也可以使用模組定義檔來匯出 DLL 函式宣告 當您使用模組定義檔案, 您不須將函式關鍵字加入至匯出 DLL 函式。 在模組定義檔, LIBRARY 陳述式和 EXPORTS 陳述式宣告為 DLL。 下列程式碼是定義檔的範例。
// SampleDLL.def
//
LIBRARY "sampleDLL"

EXPORTS
  HelloWorld

範例 DLL 和應用程式

藉由選取 Win 32 動態連結程式庫 專案類型或 MFC AppWizard (dll) 專案類型來在 Microsoft Visual C++ 6.0, 您可以建立 DLL。

下列程式碼是範例的 Visual C++ 中藉由使用 Win 32 動態連結程式庫 專案類型所建立 DLL。
// SampleDLL.cpp
//

#include "stdafx.h"
#define EXPORTING_DLL
#include "sampleDLL.h"

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    return TRUE;
}

void HelloWorld()
{
	MessageBox( NULL, TEXT("Hello World"), TEXT("In a DLL"), MB_OK);
}
// File: SampleDLL.h
//
#ifndef INDLL_H
#define INDLL_H

#ifdef EXPORTING_DLL
extern __declspec(dllexport) void HelloWorld() ;
#else
extern __declspec(dllimport) void HelloWorld() ;
#endif

#endif
下列程式碼是的 Win 32 應用程式 專案 SampleDLL DLL 中呼叫匯出 DLL 函式的範例。
// SampleApp.cpp 
//

#include "stdafx.h"
#include "sampleDLL.h"

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{ 	
	HelloWorld();
	return 0;
}
請注意 在載入時間 - 動態連結, 您必須連結 SampleDLL.lib 您建置 SampleDLL 專案時, 建立匯入程式庫。

Run - Time 動態連結, 在您使用程式碼都類似於下列程式碼來呼叫 SampleDLL.dll 匯出 DLL 函式
...
typedef VOID (*DLLPROC) (LPTSTR);
...
HINSTANCE hinstDLL;
DLLPROC HelloWorld;
BOOL fFreeDLL;

hinstDLL = LoadLibrary("sampleDLL.dll");
if (hinstDLL != NULL)
{
    HelloWorld = (DLLPROC) GetProcAddress(hinstDLL, "HelloWorld");
    if (HelloWorld != NULL)
        (HelloWorld);

    fFreeDLL = FreeLibrary(hinstDLL);
}
...
當您編譯並連結 SampleDLL 應用程式, Windows 作業系統搜尋為 SampleDLL DLL 在下列位置依此順序:
  1. 應用程式資料夾
  2. 目前的資料夾
  3. Windows 系統資料夾

    請注意 GetSystemDirectory 函式傳回的 Windows 系統資料夾路徑。
  4. Windows 資料夾

    請注意 GetWindowsDirectory 函式傳回的 Windows 資料夾路徑。

. NET Framework 組件

在引入的 Microsoft . NET 和 . NET Framework, 大部份一種是與 DLL 相關聯的問題已經被排除藉由使用組件。 組件是一個邏輯單位的功能在控制項的 . NET Common Language Runtime (CLR) 下執行。 組件實際存在當做 . dll 檔或 . exe 檔案。 不過, 內部使用的組件有很大的不同由 Microsoft Win 32 DLL。

組件檔案包含組件資訊清單、 型別中繼資料、 Microsoft Intermediate Language (MSIL) 程式碼及其他資源。 組件資訊清單含有組件中繼資料, 提供所需為組件設定為自我描述的所有資訊。 下列資訊包含在組件資訊清單:
  • 組件名稱
  • 版本資訊
  • 文化特性 (Culture) 資訊
  • 強式名稱資訊
  • 組件的檔案清單
  • 型別的參考資訊
  • 參考和相依組件資訊
組件中所包含之 MSIL 程式碼無法直接執行。 相反地, 是透過在 CLR 管理 MSIL 程式碼執行。 根據預設值, 當您建立的組件, 組件是專屬於該應用程式。 以建立共用組件要求您為組件指定強式名稱並再發佈該組件在全域組件快取。

下列清單說明幾項功能的組件相較於 Win 32 DLL 的功能:
  • 自我描述
    當您建立的組件, 所需為 CLR 要執行之組件的所有資訊包含在組件資訊清單中。 組件資訊清單包含相依組件的清單。 因此, the CLR 可以維護一組一致的, 是使用應用程式中的組件。 在 Win 32 DLL, 您無法維護一組當您使用共用 DLL 中使用的應用程式 DLL 之間的一致性。
  • 版本控制
    在組件資訊清單 (Assembly Manifest, 版本資訊記錄, 由 CLR 強制執行。 除此之外, 版本原則讓您強制執行版本 - 特定用法。 由作業系統強制在 Win 32 DLL, 版本無法被執行。 相反地, 您必須確定該 DLL 是回溯相容。
  • side - by - side 部署
    組件支援 side - by - side 部署。 某個應用程式可以使用一個版本的組件, 並另一個應用程式使用不同版本的組件。 在 Windows 2000, 啟動 side - by - side 部署支援藉由在應用程式資料夾中找出 DLL。 除此之外, Windows 檔案保護防止系統 DLL 無法覆寫或由未經授權的代理程式所取代。
  • self-containment 和隔離
    藉由使用的組件是開發的應用程式可以是獨立 (Self - Contained) 和獨立於其他電腦上執行的應用程式。 這項功能可協助您建立零影響安裝。
  • 執行
    安全性使用權限, 是提供組件資訊清單中且由 CLR 控制下執行的組件。
  • 語言獨立
    可藉由使用其中任何一種支援的 . NET 語言開發的組件。 舉例來說, 您可以開發的組件在 Microsoft Visual C# 中, 並在 Microsoft Visual Basic . NET 專案使用組件。

?考

如需 DLL 和 . NET Framework 組件, 請造訪下列 Microsoft 網站:
DLL [ 說明 ] 資料庫
http://support.microsoft.com/dllhelp

DLL 衝突
http://msdn2.microsoft.com/en-us/library/ms811694.aspx

實作 side - by - side 元件在應用程式共用
http://msdn2.microsoft.com/en-us/library/ms811700.aspx

隔離應用程式和 side - by - side assemblies for Windows XP 如何建置及服務
http://msdn2.microsoft.com/en-us/library/ms997620.aspx

與 . NET Framework 可簡化部署並解決 DLL 衝突
http://msdn2.microsoft.com/en-us/netframework/aa497268.aspx

. NET Framework 項 o 人員手冊 》: 組件
http://msdn2.microsoft.com/en-us/library/hk5f40ct(vs.71).aspx

Run - Time 動態連結
http://msdn2.microsoft.com/en-us/library/ms685090.aspx

執行緒區域儲存區
http://msdn2.microsoft.com/en-us/library/ms686749.aspx

屬性

文章編號: 815065 - 上次校閱: 2007年12月4日 - 版次: 5.9
這篇文章中的資訊適用於:
  • Microsoft Windows Server 2003, Datacenter Edition (32-bit x86)
  • Microsoft Windows Server 2003, Datacenter Edition for Itanium-Based Systems
  • Microsoft Windows Server 2003, Datacenter x64 Edition
  • Microsoft Windows Server 2003, Enterprise Edition (32-bit x86)
  • Microsoft Windows Server 2003, Enterprise Edition for Itanium-based Systems
  • Microsoft Windows Server 2003, Enterprise x64 Edition
  • Microsoft Windows Server 2003, Standard Edition (32-bit x86)
  • Microsoft Windows Server 2003, Standard x64 Edition
  • Microsoft Windows Server 2003, Web Edition
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Datacenter Server
  • Microsoft Windows 2000 Server
  • Microsoft Windows XP Professional
  • Microsoft Windows XP Home Edition
  • Microsoft Windows XP Media Center Edition
  • Microsoft Windows XP Tablet PC Edition
  • Microsoft Windows 2000 Professional Edition
  • Microsoft Windows NT 4.0
  • Microsoft Windows NT Workstation 4.0 Developer Edition
  • Microsoft Windows NT Workstation 3.51
  • Microsoft Windows 98 Second Edition
  • Microsoft Visual Studio .NET 2003 Professional Edition
  • Microsoft Visual Studio .NET 2003 Enterprise Architect
  • Microsoft Visual Studio .NET 2003 Enterprise Developer
  • Microsoft Visual Studio .NET 2003 Academic Edition
  • Microsoft Visual Studio .NET 2002 Professional Edition
  • Microsoft Visual Studio .NET 2002 Enterprise Architect
  • Microsoft Visual Studio .NET 2002 Enterprise Developer
  • Microsoft Visual Studio .NET 2002 Academic Edition
  • Microsoft Visual Studio 6.0 Professional Edition
  • Microsoft Visual Studio 6.0 Enterprise Edition
  • Microsoft Visual Studio 2005 Express Edition
  • Microsoft Visual Studio 2005 Professional Edition
  • Microsoft Visual Studio 2005 Standard Edition
  • Microsoft Office XP Professional Edition
  • Microsoft Office XP Small Business Edition
  • Microsoft Office XP Standard Edition
  • Microsoft Office Standard Edition 2003
  • Microsoft Office Professional Edition 2003
  • Microsoft Office Small Business Edition 2003
  • Microsoft Office Standard Edition 2003
關鍵字:?
kbxplatform kbtshoot kbdebug kbdll kbinfo KB815065 KbMtzh kbmt
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。如果您發現錯誤,並想要協助我們進行改善,請填寫本篇文章下方的問卷。
按一下這裡查看此文章的英文版本:815065
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com