Co to jest biblioteka DLL?


Streszczenie


W tym artykule opisano, co to jest biblioteka dołączana dynamicznie (DLL) i różne problemy, które mogą wystąpić podczas używania bibliotek DLL.

Następnie w tym artykule opisano niektóre zagadnienia zaawansowane, które należy wziąć pod uwagę podczas opracowywania własnych bibliotek DLL. W opisie co DLL jest, w tym artykule opisano metody łączenia dynamiczne, zależności DLL punkty wejścia DLL, eksportowanie funkcji DLL i DLL narzędzia do rozwiązywania problemów.

W tym artykule kończy się z wysokiego poziomu porównania bibliotek DLL do zestawów.NET Framework firmy Microsoft.

WPROWADZENIE


Dla systemów operacyjnych Microsoft Windows, które są wymienione w sekcji "Informacje zawarte w tym artykule dotyczą" wiele funkcji systemu operacyjnego jest dostarczana przez biblioteki dołączane dynamicznie (DLL). Ponadto jeśli program jest uruchomiony na jednym z tych systemów operacyjnych Windows, wiele funkcji programu mogą być świadczone przez biblioteki dll. Na przykład niektóre programy mogą zawierać wiele różnych modułów, a każdy moduł programu jest zawarte i rozpowszechniane w bibliotekach DLL.

Korzystanie z bibliotek dll pomaga promować modularyzacji kodu, ponowne użycie kodu, efektywne wykorzystywanie pamięci i zmniejszyć miejsce na dysku. W związku z tym systemu operacyjnego i programów ładowały się szybciej, szybciej i zająć mniej miejsca na dysku na komputerze.

Gdy program używa biblioteki DLL, problem, który nazywa się zależność może spowodować nie do uruchomienia programu. Gdy program używa biblioteki DLL, powstaje zależność. Jeśli inny program jest zastąpienie i dzieli tę zależność, oryginalny program nie może działać pomyślnie.

Wraz z wprowadzeniem programu Microsoft.NET Framework większość problemów zależności zostały wyeliminowane za pomocą zestawów.

Więcej informacji


Co to jest biblioteka DLL?

Biblioteka DLL to biblioteka, która zawiera kod i dane, które mogą być używane przez więcej niż jeden program w tym samym czasie. Na przykład w systemach operacyjnych Windows, Comdlg32 DLL wykonuje wspólne okno dialogowe związane z funkcji. W związku z tym każdy program może używać funkcje zawarte w tej bibliotece DLL do wdrożenia otwarte okno dialogowe. Dzięki temu promować efektywne wykorzystywanie pamięci i ponowne użycie kodu.

Przy użyciu biblioteki DLL, program może być podzielony na oddzielne składniki. Na przykład program księgowy mogą być sprzedawane przez moduł. Każdy moduł mogą być ładowane do programu głównego w czasie wykonywania, jeśli zainstalowano tego modułu. Ponieważ moduły są oddzielne, czas ładowania programu jest szybsza, a moduł jest ładowany tylko kiedy funkcja jest wymagane.

Ponadto aktualizacje są łatwiejsze do zastosowania do każdego modułu bez wpływu na pozostałe części programu. Na przykład może mieć program wynagrodzeń i stawek podatkowych zmienić każdego roku. Zmiany te są odizolowane do biblioteki DLL, można zastosować aktualizację bez konieczności tworzenia lub ponownie zainstalować cały program.

Na poniższej liście opisano niektóre pliki, które są implementowane jako biblioteki dll w systemach operacyjnych Windows:
  • Pliki formantów ActiveX (OCX)
    Przykładem formantu ActiveX jest formant kalendarza, który pozwala wybrać datę z kalendarza.
  • Sterowania (.cpl) panelu pliki
    Przykład pliku .cpl jest elementu, który znajduje się w Panelu sterowania. Każdy element jest specjalistyczne biblioteki DLL.
  • Pliki sterownika (.drv) urządzenia
    Przykładowy sterownik urządzenia jest sterownikiem drukarki, który kontroluje drukowanie na drukarce.

Zalety DLL

Na poniższej liście opisano niektóre z korzyści, które są dostarczane, gdy program użyje biblioteki DLL:
  • Wykorzystująca mniejszą ilość zasobów
    Gdy sam biblioteka funkcji korzysta wiele programów, biblioteka DLL może zmniejszyć powielanie kodu, który jest ładowany na dysku i w pamięci fizycznej. To znacznie wpływać na działanie nie tylko program uruchomiony na pierwszym planie, ale również inne programy, które są uruchomione w systemie operacyjnym Windows.
  • Promuje Modułowa architektura
    Biblioteka DLL wspomaga opracowywanie programów modułowych. Pomaga to rozwijać dużych programów, które wymagają wielu wersji językowych lub program, który wymaga Modułowa architektura. Przykładem programu modułowe jest program księgowy, który ma wiele modułów, które mogą być ładowane dynamicznie w czasie wykonywania.
  • Krzywe napięcia wdrażania i instalacji
    Gdy funkcji w bibliotece DLL wymaga aktualizacji lub poprawki, wdrażania i instalacji biblioteki DLL nie wymaga programu wymagających ponownego połączenia z biblioteką DLL. Ponadto jeśli w tej samej bibliotece DLL korzysta wiele programów, wiele programów wszystkie skorzystają z aktualizacja lub poprawka. Ten problem może występować częściej, korzystając z biblioteki DLL innej firmy, która jest regularnie aktualizowany lub stałej.

Biblioteka DLL zależności

Gdy program lub bibliotekę DLL używa funkcji DLL w innej biblioteki DLL, tworzony jest zależność. W związku z tym program nie jest już odrębna, a program mogą wystąpić problemy, jeśli zależność jest uszkodzony. Na przykład program może nie działać, jeśli występuje jeden z następujących czynności:
  • Zależne biblioteki DLL zostanie uaktualniony do nowej wersji.
  • Ustala się zależnego pliku DLL.
  • Zależnego pliku DLL jest zastępowany wcześniejszej wersji.
  • Zależnego pliku DLL jest usuwany z komputera.
Te akcje są powszechnie znane jako konflikty biblioteki DLL. Jeżeli zgodność ze starszymi wersjami nie jest wymuszane, program nie może pomyślnie uruchomiony.

Na poniższej liście opisano zmiany, które zostały wprowadzone w systemie Microsoft Windows 2000 i nowszych systemach operacyjnych Windows, w celu zmniejszenia problemów z zależnością:
  • Ochrona plików systemu Windows
    W ochrona plików systemu Windows system operacyjny uniemożliwia systemowej biblioteki dll z jest aktualizowany lub usunięte przez nieautoryzowany agent. W związku z tym podczas instalacji program próbuje usunąć lub zaktualizować biblioteki DLL, która jest zdefiniowana jako biblioteki DLL systemu, ochrona plików systemu Windows będzie szukał prawidłowy podpis cyfrowy.
  • Biblioteki DLL prywatnego
    Niech bibliotek DLL prywatnego wyizolować programu od zmiany wprowadzone do bibliotek DLL. prywatne pliki dll użyć pliku .local puste lub informacje specyficzne dla wersji, aby wymusić wersji biblioteki dll, która jest używana przez program. Aby użyć prywatnych bibliotek DLL, należy zlokalizować plik dll w folderze głównym programu. Następnie dla nowych programów, należy dodać informacje specyficzne dla wersji biblioteki dll. Dla starych programów należy użyć pliku .local pusty. Każda metoda informuje system operacyjny do użycia prywatnych bibliotek DLL, które znajdują się w folderze głównym programu.

Biblioteka DLL narzędzia do rozwiązywania problemów

Kilka narzędzi dostępnych może pomóc w rozwiązaniu problemów DLL. Następujące narzędzia są niektóre z tych narzędzi.

Zależność Walker

Narzędzie Walkera zależności można rekursywnie skanowanie w poszukiwaniu wszystkich zależne biblioteki dll, które są używane przez program. Po otwarciu programu w zależność Walker Walker zależności wykonuje następujące kontrole:
  • Zależność Walker sprawdza, czy Brak bibliotek DLL.
  • Zależność Walker sprawdza, czy pliki programów lub bibliotek DLL, które nie są prawidłowe.
  • Zależność Walker sprawdza, że przywóz funkcje i wywóz funkcji match.
  • Zależność Walker sprawdza, czy błędy zależność cykliczną.
  • Zależność Walker sprawdza, czy moduły, które są nieprawidłowe, ponieważ moduły są dla innego systemu operacyjnego.
Za pomocą Walkera zależności, można udokumentować wszystkich bibliotek DLL używanych przez program. Może to pomóc zapobiec i skorygować problemy DLL, które mogą pojawić się w przyszłości. Podczas instalowania programu Microsoft Visual Studio 6.0, Walkera zależności znajduje się w następującym katalogu:
dysk\Program Files\Microsoft Visual Studio\Common\Tools

Rozwiązywanie problemów Universal DLL

Narzędzie DLL dodatku Solver Problem uniwersalny (DUPS) służy do inspekcji, porównaj dokument i wyświetlania informacji biblioteki DLL. Poniższa lista zawiera opis narzędzi, które umożliwiają narzędzia DUPS:
  • Dlister.exe
    Narzędzie to wylicza wszystkie biblioteki dll na komputerze i rejestruje informacje do pliku tekstowego lub pliku bazy danych.
  • Dcomp.exe
    Narzędzie to porównuje pliki dll, które są wymienione w dwóch plikach tekstowych i produkuje trzeciego pliku tekstowego, zawierającego różnice.
  • Dtxt2DB.exe
    To narzędzie ładuje pliki tekstowe, które są tworzone za pomocą narzędzia Dlister.exe i narzędzia Dcomp.exe do dllHell bazy danych.
  • DlgDtxt2DB.exe
    To narzędzie zawiera graficznego interfejsu użytkownika (GUI) programu narzędzia Dtxt2DB.exe.
Aby uzyskać więcej informacji na temat narzędzia DUPS kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
247957 przy użyciu DUPS.exe Aby rozwiązać problemy ze zgodnością DLL

Biblioteka DLL pomocy bazy danych

Biblioteka DLL pomocy bazy danych pomaga w zlokalizowaniu określonej wersji biblioteki dll, które są instalowane przez oprogramowanie firmy Microsoft. Aby uzyskać więcej informacji o bazie danych biblioteki DLL pomocy odwiedź następującą witrynę firmy Microsoft w sieci Web:

Projektowanie biblioteki DLL

W tej sekcji opisano zagadnienia i wymagań, które należy rozważyć podczas opracowywania własnych bibliotek DLL.

Typy bibliotek DLL

Podczas ładowania biblioteki DLL w aplikacji, dwie metody łączenia pozwalają wywoływać eksportowanych funkcji DLL. Dwie metody łączenia są dynamiczne łączenie w czasie ładowania i wykonywania dynamicznego łączenia.
Dynamiczne łączenie w czasie ładowania
W czasie ładowania dynamiczne łączenie aplikacji wywołań jawne do eksportowanych funkcji DLL, jak funkcje lokalne. Aby użyć dynamicznego łączenia czas ładowania, zapewniają pliku nagłówka (.h) i pliku importu biblioteki (lib) podczas kompilowania i łączenia aplikacji. Po wykonaniu tej czynności program łączący będzie dostarczać informacje, które są wymagane do załadowania biblioteki DLL i rozpoznać lokalizacji eksportowanych funkcji DLL w czasie ładowania systemu.
Dynamiczne łączenie w czasie wykonywania
W czasie wykonywania dynamicznych łączeniu aplikacja wywoła funkcję LoadLibrary lub LoadLibraryEx funkcji załadować biblioteki DLL w czasie wykonywania. Po pomyślnym załadowaniu biblioteki DLL, używasz funkcji GetProcAddress Aby uzyskać adres wyeksportowanej funkcji DLL, który chcesz wywołać. Korzystając z dynamiczne łączenie w czasie wykonywania, nie należy plik importu biblioteki.

Na poniższej liście opisano kryteria aplikacji do wykorzystania czasu ładowania dynamicznego łączenia i kiedy używać dynamiczne łączenie w czasie wykonywania:
  • Szybkość uruchamiania się systemu
    Jeśli ważne jest wydajność początkowego uruchamiania aplikacji, należy użyć dynamiczne łączenie w czasie wykonywania.
  • Łatwość użytkowania
    W czasie ładowania dynamiczne łączenie eksportowanych funkcji DLL przypominają funkcje lokalne. Dzięki temu łatwo można wywoływać te funkcje.
  • Logikę aplikacji
    W czasie wykonywania dynamicznych łączeniu aplikacji można rozgałęzić ładowania różnych modułów zgodnie z wymaganiami. Jest to ważne podczas opracowywania wersji wielu języków.

Punkt wejścia DLL

Podczas tworzenia biblioteki DLL, można opcjonalnie określić funkcję punktu wejścia. Funkcja punktu wejścia jest wywoływana, gdy procesy i wątki przyłączają się do biblioteki DLL lub odłączono się od biblioteki DLL. Można użyć funkcji punktu wejścia, zainicjować struktury danych lub zniszczyć struktur danych zgodnie z wymogami biblioteki DLL. Ponadto jeśli aplikacja jest wielowątkowym, można użyć lokalnego magazynu wątków (TLS) przydzielić pamięci, która jest prywatne dla każdego wątku w funkcji punktu wejścia. Następujący kod jest przykładem funkcji punktu wejścia biblioteki 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;
}
Gdy funkcja punktu wejścia zwraca wartość FALSE , aplikacja nie rozpocznie Jeśli używasz dynamiczne łączenie w czasie ładowania. Jeśli używasz dynamiczne łączenie wykonywania poszczególnych DLL nie zostanie załadowany.

Funkcja punktu wejścia powinny wykonywać tylko zadania inicjowania proste i nie należy wywoływać inne ładowania biblioteki DLL lub funkcji rozwiązania. Na przykład w funkcji punktu wejścia, należy nie bezpośrednio lub pośrednio wywołać funkcji LoadLibrary lub LoadLibraryEx . Nie należy ponadto wywołanie funkcji FreeLibrary , gdy proces zostaje zatrzymany.

Uwaga W aplikacjach wielowątkowych, upewnij się, że dostęp do danych globalnych DLL jest zsynchronizowany (wątkowego), aby uniknąć uszkodzenia danych. Aby to zrobić, należy używać szyfrowania TLS do dostarczania danych unikatowy dla każdego wątku.

Eksportowanie funkcji DLL

Aby wyeksportować funkcji DLL, możesz dodać słowo kluczowe function do eksportowanych funkcji DLL lub utworzyć plik definicji (o rozszerzeniu def) moduł zawierający listę eksportowanych funkcji DLL.

Aby użyć słowa kluczowego function, należy zadeklarować każdej funkcji, którą chcesz wyeksportować z następujących słów kluczowych:
__declspec(dllexport)
Aby użyć eksportowanych funkcji DLL w aplikacji, należy zadeklarować każdej funkcji, którą chcesz zaimportować z następujących słów kluczowych:
__declspec(DllImport)
Zazwyczaj należy użyć jednego pliku nagłówka, który ma instrukcja zdefiniować i instrukcji ifdef do oddzielania instrukcji eksportu i instrukcji import.

Plik definicji modułu umożliwia również zadeklarować eksportowanych funkcji DLL. Gdy używasz plik definicji modułu, nie trzeba dodać słowo kluczowe function do eksportowanych funkcji DLL. W pliku definicji modułu można zadeklarować biblioteki instrukcji oraz instrukcji EXPORTS dla biblioteki DLL. Następujący kod jest przykładem pliku definicji.
// SampleDLL.def
//
LIBRARY "sampleDLL"

EXPORTS
HelloWorld

Przykładowa DLL i aplikacji

Microsoft Visual C++ 6.0, można utworzyć bibliotekę DLL wybierając typ projektu Biblioteki DLL systemu Win32 lub
Typ projektu MFC AppWizard (dll) .

Następujący kod jest przykładem biblioteki DLL, który został utworzony w programie Visual C++ przy użyciu
Typ projektu Biblioteki DLL systemu Win32 .
// 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
Następujący kod jest przykładem projekt Aplikacji Win32 , która wywołuje funkcję DLL wywożonych w bibliotece DLL SampleDLL.
// SampleApp.cpp 
//

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

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HelloWorld();
return 0;
}
Uwaga W czasie ładowania dynamicznego łączenia należy połączyć import biblioteki SampleDLL.lib, który jest tworzony podczas tworzenia projektu SampleDLL.

W czasie wykonywania dynamicznych łączeniu użyć kodu, który jest podobny do następującego kodu do wywołania SampleDLL.dll wyeksportowanej funkcji 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);
}
...
Podczas kompilowania i powiązać z aplikacji SampleDLL systemu operacyjnego Windows wyszukuje DLL SampleDLL w następujących lokalizacjach w następującej kolejności:
  1. Folder aplikacji
  2. Bieżący folder
  3. Folder systemu Windows

    Uwaga Funkcja GetSystemDirectory zwraca ścieżkę folderu systemu Windows.
  4. Windows folder

    Uwaga Funkcja GetWindowsDirectory zwraca ścieżkę folderu systemu Windows.

Zestaw.NET Framework

Wraz z wprowadzeniem systemu Microsoft .NET i.NET Framework zostały wyeliminowane większość problemów, które są skojarzone z bibliotek DLL za pomocą zestawów. Zespół jest logiczna jednostka funkcję, która działa pod kontrolą systemu .NET wykonywalnych języka (wspólnego CLR). Zespół istnieje fizycznie jako plik .dll lub pliku .exe. Jednak wewnętrznie zestawu jest bardzo różni się od biblioteki DLL systemu Win32 firmy Microsoft.

Plik zestawu zawiera manifestu zestawu, typu metadanych, Microsoft intermediate language (MSIL) kod i inne zasoby. Manifest zestawu zawiera metadane zestawu, który zawiera wszystkie informacje wymagane dla zestawu do być uzależnienie. Następujące informacje są zawarte w manifeście zestawu:
  • Nazwa zestawu
  • Informacje o wersji
  • Informacji o kulturze
  • Informacje o silnej nazwy
  • Na liście zestawu plików
  • Informacje o typie odwołania
  • Informacje o zestawie odwołania i zależne
Kodu MSIL, który jest zawarty w zestawie nie mogą być wykonywane bezpośrednio. Zamiast tego wykonanie kodu MSIL jest zarządzany za pośrednictwem środowiska CLR. Domyślnie podczas tworzenia zestawu, zgromadzenie jest prywatny do aplikacji. Aby utworzyć udostępnionego zestawu wymaga przypisać silnej nazwy zestawu, a następnie opublikować zestawu w globalna pamięć podręczna zestawów.

Na poniższej liście opisano niektóre funkcje zestawów, w porównaniu z funkcjami biblioteki DLL systemu Win32:
  • Samodzielnie opisujący
    Podczas tworzenia zestawu, wszystkie informacje, które jest wymagane do uruchamiania zestawu CLR jest zawarty w manifeście zestawu. Manifest zestawu zawiera listę zestawów zależnych. W związku z tym CLR można zachować spójny zestaw zestawy, które są używane w aplikacji. W bibliotekach DLL systemu Win32 nie można zachować spójność między zbiór bibliotek DLL, które są używane w aplikacji, korzystając z współużytkowane biblioteki dll.
  • Przechowywanie wersji
    Informacje o wersji manifest zestawu jest rejestrowane i wymuszane przez środowisko CLR. Ponadto wersja zasady pozwalają wymusić użycie określonej wersji. W bibliotekach DLL systemu Win32 przechowywanie wersji nie można wymusić przez system operacyjny. Zamiast tego należy się upewnić, że pliki dll są zgodne z poprzednimi wersjami.
  • Wdrażania Side-by-side
    Zespoły obsługi wdrożenia side-by-side. Jedna aplikacja może korzystać jednej wersji zestawu, a inna aplikacja może używać innej wersji zestawu. Począwszy od systemu Windows 2000, wdrażania side-by-side jest obsługiwany przez lokalizację biblioteki dll w folderze aplikacji. Dodatkowo ochrona plików systemu Windows zapobiega systemowej biblioteki dll przed zastępowane lub zastąpione przez nieautoryzowany agent.
  • Własny zamknięcia i izolacji
    Aplikacja, która jest opracowana przy użyciu zestawu może być niezależnym i odizolowana od innych aplikacji, które są uruchomione na komputerze. Ta funkcja ułatwia tworzenie instalacji bez wpływu.
  • Wykonanie
    Zespół jest uruchamiana uprawnienia zabezpieczeń, które są dostarczane w manifeście zestawu i które są sterowane przez środowisko CLR.
  • Niezależny od języka
    Zespół mogą być opracowywane przy użyciu jednej z obsługiwanych języków .NET. Na przykład można rozwijać zestawu w Microsoft Visual C#, a następnie użyć zestawu w projekcie Microsoft Visual Basic .NET.

Powiązane artykuły


Aby uzyskać więcej informacji na temat bibliotek DLL i zestawów.NET Framework odwiedź następujące witryny firmy Microsoft w sieci Web:
Konflikty biblioteki DLL
http://msdn2.microsoft.com/en-us/library/ms811694.aspx

Wdrażanie składnika side-by-side udostępniania w aplikacjach
http://msdn2.microsoft.com/en-us/library/ms811700.aspx

Jak tworzyć i usługi odizolowane aplikacje i zespoły side-by-side dla systemu Windows XP
http://msdn2.microsoft.com/en-us/library/ms997620.aspx

Uproszczona instalacja i rozwiązywania konfliktów DLL z.NET Framework
http://msdn2.microsoft.com/en-us/netframework/aa497268.aspx

Podręcznik dewelopera.NET Framework: zestawy
http://msdn2.microsoft.com/en-us/library/hk5f40ct(vs.71).aspx

Dynamiczne łączenie w czasie wykonywania
http://msdn2.microsoft.com/en-us/library/ms685090.aspx

Lokalnego magazynu wątków
http://msdn2.microsoft.com/en-us/library/ms686749.aspx