Что такое библиотека DLL?


Обзор


В данной статье описывается, что такое библиотеки динамической компоновки (DLL) и какие проблемы могут возникнуть при их использовании.

В этой статье описываются некоторые дополнительные вопросы, которые следует учитывать при разработке собственных библиотек DLL. При описании того, чем является DLL, в данной статье описываются методы динамической компоновки, зависимости DLL точки входа DLL, экспорт функции DLL и средства устранения неполадок в DLL.

В этой статье завершается со сравнением высокого уровня библиотеки DLL сборки Microsoft платформа.NET Framework.

ВВЕДЕНИЕ


Для операционных систем Microsoft Windows, перечисленных в разделе «Данная статья применима к» большая часть функциональных возможностей операционной системы обеспечивается библиотеки динамической компоновки (DLL). Кроме того при запуске программы на одной из этих операционных систем Windows, большинство функций программы может предоставляться библиотеками DLL. Например некоторые программы могут содержать множество различных модулей и каждый модуль программы содержится и распределенные в библиотеках DLL.

Использование библиотек DLL способствует модульная структура кода, повторное использование кода, эффективного память и дисковое пространство. Таким образом операционная система и программы загружаются быстрее, работают быстрее и занимают меньше места на диске на компьютере.

Когда программа использует библиотеку DLL, проблема, которая называется зависимость может привести к не на выполнение программы. Когда программа использует библиотеку DLL, создается зависимость. Если другая программа перезаписывает и разбивает эту зависимость, исходная программа может перестать функционировать.

С внедрением в Microsoft платформы.NET Framework большинство проблем зависимости были устранены с помощью сборок.

Дополнительные сведения


Что такое библиотека DLL?

DLL — это библиотека содержащая код и данные, которые могут использоваться более чем одной программой одновременно. Например, в операционных системах Windows, библиотека Comdlg32 выполняет общие функции, связанные с диалоговыми окнами. Таким образом каждая программа может использовать функцию, которая содержится в этой библиотеке DLL для реализации диалогового окна Открыть . Это помогает повысить уровень повторного использования кода и эффективности память.

С помощью библиотеки DLL программы может быть модульности на отдельные компоненты. Например, программа учета может продаваться по модулям. Каждый модуль может быть загружен в основной программе во время выполнения при установке данного модуля. Поскольку программа разделена на модули, её загрузка выполняется быстрее и модули загружаются только при вызове их функций.

Кроме того обновления, проще применять для каждого модуля, не влияя на другие части программы. Например имеется программа по зарплате и изменении ставок налога каждый год. Когда эти изменения изолированы с библиотекой DLL, можно применить обновление без необходимости создания или установить программу целиком.

Ниже перечислены некоторые из файлов, которые реализованы в виде библиотеки DLL в операционных системах Windows.
  • Файлы ActiveX Controls (.ocx)
    Примером элемента управления ActiveX является элемент управления календаря, который позволяет выбрать дату с помощью календаря.
  • Файлы панели (.cpl) элементов управления
    Пример файла .cpl — элемент, который расположен на панели управления. Каждый элемент представляет собой специализированную Библиотеку.
  • Файлы драйвера (.drv) устройства
    Пример драйвера устройства — драйвер принтера, который управляет печатью на принтере.

Преимущества DLL

Ниже перечислены некоторые преимущества, которые предоставляются, когда программа использует библиотеку DLL.
  • Использует меньше ресурсов
    При нескольких программ с помощью той же библиотеки функций, библиотеки DLL можно уменьшить дублирование кода, который загружается на диске и в оперативной памяти. Это может значительно повлиять на производительность не только программы, работающей в фоновом режиме, но также и другие программы, выполняющиеся в операционной системе Windows.
  • Обеспечивается модульная архитектура
    Библиотека DLL способствует разработке модульных программ. Это позволяет разрабатывать крупные программы, которые требуют нескольких языковых версий или программу, которая требует модульную архитектуру. Примером модульной программы является бухгалтерская программа, которая имеет много модулей, которые могут динамически загружаться во время выполнения.
  • Облегчает развертывание и установку
    Если функции в библиотеке DLL требуется обновление или исправление, развертывание и установка библиотеки DLL не требует повторной связи программы с библиотекой DLL. Кроме того Если несколько программ используют ту же библиотеку DLL, несколько программ будут все преимущества обновления или исправления. Такое поведение чаще наблюдается при использовании DLL независимых производителей, которая регулярно обновляется или фиксированной.

Зависимости библиотек DLL

Когда программа или библиотека DLL использует функцию DLL в другой библиотеке DLL, создается зависимость. Таким образом программа больше не является самодостаточной и у программы могут возникнуть проблемы, если зависимость не работает. Например программа может не работать, если произойдет одно из следующих действий:
  • Зависимые DLL обновляется до новой версии.
  • Исправлена зависимая библиотека DLL.
  • Зависимый DLL-файл перезаписывается более ранней версией.
  • Зависимые библиотеки DLL удалены с компьютера.
Эти действия обычно называются конфликты DLL-Библиотек. Если не обеспечивается обратная совместимость, программа не может успешно запущена.

Ниже перечислены изменения, которые были представлены в Microsoft Windows 2000 и более поздних операционных систем Windows, чтобы свести к минимуму проблемы с зависимостями.
  • Защита файлов Windows
    В защиты файлов Windows операционная система предотвращает системные библиотеки DLL из обновляемой или удаляемой несанкционированного посредником. Таким образом программа установки попытается удалить или обновить библиотеку DLL, которая определяется как Библиотека системы, защиты файлов Windows будет выглядеть для цифровой подписи.
  • Частные библиотеки DLL
    Закрытых библиотек позволяют изолировать программы из изменений, внесенных в общих библиотек DLL закрытых библиотек DLL. использовать сведения о версии или .local пустой файл для обеспечения версию библиотеки DLL, используемой программой. Чтобы использовать закрытых библиотек DLL, найдите библиотеки DLL в корневой папке программы. Для программ, добавьте сведения о версии в библиотеке DLL. Для старых программ используйте .local пустой файл. Каждый метод сообщает операционной системе для использования закрытых библиотек DLL, расположенные в корневой папке программы.

Средства устранения неполадок DLL

Доступны несколько средств устранения неполадок DLL. Следующие средства являются некоторые из этих средств.

Dependency Walker

Средства Dependency Walker можно рекурсивный поиск всех зависимых библиотек 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

Универсального решения проблемы (DUPS) DLL инструмент используется для аудита, сравнение документов и отображения сведений библиотеки DLL. Ниже перечислены средства, составляющие средства DUPS.
  • Dlister.exe
    Эта служебная программа перечисляет все библиотеки DLL на компьютере и записывает данные в текстовый файл или файл базы данных.
  • Dcomp.exe
    Эта служебная программа сравнивает библиотеки DLL, которые перечислены в два текстовых файла и создает третий текстовый файл, содержащий различия.
  • Dtxt2DB.exe
    Эта служебная программа загружает текстовые файлы, которые создаются с помощью служебной программы Dlister.exe и Dcomp.exe программу в базу данных dllHell.
  • DlgDtxt2DB.exe
    Это средство предоставляет графический пользовательский интерфейс (GUI) версию служебной программы Dtxt2DB.exe.
Дополнительные сведения о средстве DUPS щелкните следующий номер статьи базы знаний Майкрософт:
247957 с помощью DUPS.exe для разрешения проблем совместимости библиотек DLL

DLL Help базы данных

База данных DLL Help поможет найти конкретных версий библиотек DLL, установленных программных продуктов корпорации Майкрософт. Дополнительные сведения о базе данных DLL Help посетите следующий веб-узел корпорации Майкрософт:

Разработки DLL

В этом разделе описываются проблемы и требования, которые следует учитывать при разработке собственных библиотек DLL.

Виды библиотек DLL

При загрузке библиотеки DLL приложения, два способа связывания позволяют вызов экспортированных функций DLL. Два метода связывания: динамическое связывание во время загрузки и динамическое связывание во время выполнения.
Динамическая компоновка во время загрузки
В динамической компоновкой во время загрузки, приложение делает явный вызов экспортированных функций DLL как локальные функции. Использование динамической компоновкой во время загрузки, при компиляции и компоновки приложения предоставляют файл заголовка (h) и файл импорта библиотеки (LIB). При этом компоновщик предоставит сведения, необходимые для загрузки библиотеки DLL и разрешения расположения экспортированные функции DLL во время загрузки системы.
Динамическое сопряжение во время выполнения
В динамической компоновкой во время выполнения, приложение вызывает функции LoadLibrary или функцию LoadLibraryEx для загрузки библиотеки DLL во время выполнения. После успешной загрузки библиотеки DLL можно использовать функцию GetProcAddress Чтобы получить адрес экспортированной функции DLL, которую требуется вызвать. При использовании динамической компоновкой во время выполнения файла библиотеки импорта не требуется.

Ниже перечислены критерии для приложения, определяющие, когда используется динамическое связывание во время загрузки и когда следует использовать динамическое связывание во время выполнения.
  • Производительность при запуске
    Если важна производительность начальной загрузки приложения, следует использовать динамическое связывание во время выполнения.
  • Простота в использовании
    В динамической компоновкой во время загрузки, экспортированных функций DLL похожи на локальные функции. Это позволяет вызывать эти функции.
  • Логика приложения
    В динамической компоновкой во время выполнения, приложения могут разветвлять загрузки различных модулей при необходимости. Это важно при разработке нескольких языковых версий.

Точки входа библиотеки DLL

При создании библиотеки DLL, можно дополнительно указать функцию точки входа. Функция точки входа вызывается, когда процессы или потоки присоединяются к библиотеке DLL или отсоединяется сами из библиотеки DLL. Можно использовать функцию точки входа для инициализации структуры данных или для уничтожения структуры данных, необходимые библиотеки DLL. Кроме того в случае многопоточного приложения можно использовать локальное хранилище потока (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 , приложение не запустится при использовании динамической компоновкой во время загрузки. При использовании динамической компоновкой во время выполнения не будет загружать только отдельные библиотеки DLL.

Функция точки входа должны выполнять только те задачи инициализации простое и не должны вызывать любой загрузке библиотек DLL или функций завершения. Например в функцию точки входа не следует прямо или косвенно вызывать функции LoadLibrary или функции LoadLibraryEx . Кроме того не следует вызывать функции FreeLibrary при завершении процесса.

Примечание. В многопоточных приложениях, убедитесь, что синхронизацию доступа к данным глобального DLL (безопасный для потоков) во избежание повреждений данных. Для этого необходимо используйте протокол TLS для предоставления уникальных данных для каждого потока.

Экспорт функций DLL

Для экспорта функций библиотеки DLL, можно добавить функцию ключевое слово экспортированных функций DLL или создания файла определения модуля (DEF), содержащий список экспортированных функций DLL.

Для использования функции ключевое слово, необходимо объявить каждой функции, которую требуется экспортировать с следующее ключевое слово:
__declspec(dllexport)
Чтобы использовать экспортируемые функции DLL в приложении, необходимо объявить каждой функции, которую требуется импортировать с следующее ключевое слово:
__declspec(dllimport)
Как правило следует использовать один файл заголовка, который содержит определения инструкции и ifdef для разделения оператор экспорта и импорта операторах.

Файл определения модуля также можно использовать для объявления экспортированных функций DLL. При использовании файла определения модуля нет для добавления ключевого слова function экспортированных функций DLL. В файле определения модуля объявите оператор LIBRARY и оператора EXPORTS для библиотеки DLL. Следующий код является примером файла определения.
// SampleDLL.def
//
LIBRARY "sampleDLL"

EXPORTS
HelloWorld

Образец библиотеки DLL и приложения

В Microsoft Visual C++ 6.0, можно создать библиотеку DLL, выбрав любой тип проекта Библиотеки динамической компоновки Win32 или
Тип проекта в Мастере приложений MFC (dll) .

Следующий код является примером библиотеки DLL, которая была создана в Visual C++ с помощью
Тип проекта Библиотеки динамической компоновки 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
Следующий код является примером проекта Приложения Win32 , который вызывает экспортированную функцию DLL в Библиотеке SampleDLL.
// 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.

В динамической компоновкой во время выполнения, используйте код, аналогичный следующему коду вызывать 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 выполняет поиск DLL SampleDLL в следующих местоположениях в следующем порядке:
  1. Папка приложения
  2. Текущей папки
  3. Системную папку Windows

    Примечание. GetSystemDirectory функция возвращает путь к системной папке Windows.
  4. В папке Windows

    Примечание. Функция GetWindowsDirectory возвращает путь к папке Windows.

Платформа.NET Framework сборки

С появлением Microsoft .NET и платформа.NET Framework большинство проблем, связанных с DLL удалены с помощью сборок. Сборка представляет логическую единицу функциональности, работающей под управлением .NET общеязыковая среда выполнения (CLR). Физически сборки существует файл .dll или .exe. Тем не менее внутри сборки сильно отличается от Microsoft Win32 DLL.

Файл сборки содержит манифест сборки, метаданные типа, код промежуточного языка (MSIL) корпорации Майкрософт и других ресурсов. Манифест сборки содержит метаданные сборки, который содержит все сведения, необходимые для сборки, которую необходимо самоописанием. В манифесте сборки включается следующая информация:
  • Имя сборки
  • Сведения о версии
  • Сведения о языке и региональных параметрах
  • Сведения о строгом имени
  • Список файлов сборки
  • Сведения о типах ссылок
  • Сведения о ссылочных и зависимые сборки
Код MSIL, содержащихся в сборке не может быть выполнена непосредственно. Вместо этого выполнение кода MSIL осуществляется с помощью среды CLR. По умолчанию при создании сборки, сборка закрытыми для приложения. Для создания общей сборки необходимо присвоить строгое имя сборке, а затем опубликовать ее в глобальном кэше сборок.

Ниже перечислены некоторые возможности по сравнению с функции Win32 DLL сборки.
  • С самоописанием
    При создании сборки в манифесте сборки содержится все сведения, необходимые для запуска сборки среды CLR. Манифест сборки содержит список зависимых сборок. Таким образом среда CLR может поддерживать согласованный набор сборок, используемых в приложении. В Win32 библиотеки DLL не может поддерживать согласованность между набором библиотек DLL, которые используются в приложении при использовании общих библиотек DLL.
  • Управление версиями
    В манифесте сборки информацию о версии записи и обеспечивается средой CLR. Кроме того версия политики позволяют обеспечить использование конкретной версии. В Win32 библиотеки DLL версии не могут быть реализованы операционной системой. Вместо этого необходимо убедиться, что DLL обратно совместимы.
  • Side-by-side развертывания
    Сборки поддерживают развертывание side-by-side. Одно приложение может использовать версию сборки и другое приложение можно использовать другую версию сборки. Начиная с Windows 2000, side-by-side развертывания поддерживается поиск библиотек DLL в папке приложения. Кроме того Защита файлов Windows предотвращает системных библиотек DLL, перезапись или заменены неправомочное лицо.
  • Изоляция и самостоятельной контейнеров
    Приложения, разработанные с помощью сборки может быть автономным и изолирована от других приложений, запущенных на компьютере. Эта функция помогает создавать без влияния установок.
  • Выполнение
    Сборка выполняется с разрешениями безопасности, предоставляемыми в манифест сборки и управляются средой CLR.
  • Зависит от языка
    Сборка может быть разработан с помощью любого из поддерживаемых языков .NET. Например можно создать сборку в Microsoft Visual C# и затем использовать сборку в проект Microsoft Visual Basic .NET.

Ссылки


Дополнительные сведения о библиотеках DLL и платформа.NET Framework сборок посетите следующие веб-узлы корпорации Майкрософт:
Конфликты DLL-Библиотек
http://msdn2.microsoft.com/en-us/library/ms811694.aspx

Реализация компонента side-by-side совместного доступа в приложениях
http://msdn2.microsoft.com/en-us/library/ms811700.aspx

Способ построения и обслуживания в изолированных приложениях и -параллельные сборки для Windows XP
http://msdn2.microsoft.com/en-us/library/ms997620.aspx

Упрощение развертывания и устранения конфликтов DLL-Библиотек с платформа.NET Framework
http://msdn2.microsoft.com/en-us/netframework/aa497268.aspx

Платформа.NET Framework в руководстве разработчика: сборки
http://msdn2.microsoft.com/en-us/library/hk5f40ct(vs.71).aspx

Динамическое сопряжение во время выполнения
http://msdn2.microsoft.com/en-us/library/ms685090.aspx

Локальное хранилище потока
http://msdn2.microsoft.com/en-us/library/ms686749.aspx