Schetchiksg.ru

Счетчик СГ
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Библиотеку dll расширяемого счетчика

Как включить и получить счетчики производительности для окна Azure

Я разработал одно веб-приложение для мониторинга приложения azure (Webrole) консольным приложением(EXE), прикрепляющимся в задаче запуска с приложением azure, и что EXE будет периодически отправлять данные для использования cpu, памяти и общего сеанса asp.net, однако я сделал это с помощью запроса WMI, как показано ниже.

CPU использование

Память

asp.net сессия

Но когда я тестирую его с window Azure, то получаю ошибку в журнале событий, как показано ниже

Отключен сбор данных счетчика производительности из Служба «ASP.NET_64_2.0.50727», поскольку библиотека счетчиков производительности для этой службы породила одну или несколько ошибок. Ошибки, вызвавшие это действие, были записаны в журнал событий приложения. Исправьте ошибки перед включением счетчиков производительности для этой службы

Windows не удается открыть расширяемый счетчик 64-bit DLL ASP.NET_64_2.0.50727 в 32-битной среде. Обратитесь к поставщику файлов , чтобы получить 32-разрядную версию. В качестве альтернативы, если вы используете 64-bit в родной среде вы можете открыть расширяемый счетчик 64-bit DLL с помощью версии Монитора производительности 64-bit. Чтобы использовать этот инструмент, откройте папку Windows, откройте папку System32 и запустите Perfmon.exe.

Вот почему я хотел бы изменить свою логику с помощью класса System.Diagnostic и получить использование CPU, доступную память и общий сеанс asp.net с использованием этого класса.

У меня есть подключение RDP приложения azure и запуск perfmon.exe и просмотр доступного счетчика производительности, однако я нашел только один счетчик %processor времени, поэтому мне нужно добавить еще один счетчик.

Может ли кто-нибудь предложить мне, как я могу включить его и извлечь с помощью C# в моем приложении EXE (будет в задаче запуска)?

Ваши повторы могут быть действительно полезны мне для достижения моей цели

Заранее спасибо!
Арун. .

2 ответа

  • Невозможно захватить счетчики производительности для веб-роли Azure

Нам нужно включить 25 + счетчиков производительности в windows azure веб-ролях. Я думаю о RDP’ing и включаю их один за другим. Но это может занять много времени,а также не гарантировано, если мы увеличим масштаб. Не мог бы кто-нибудь помочь мне, можно ли автоматизировать этот процесс.

Похоже, что ваше приложение было построено как 32-разрядное приложение. Попробуйте перестроить, установив в диспетчере конфигурации значение «Any CPU», а затем повторно разверните.

Кроме того, проверьте, получили ли вы какие-либо предупреждения на deployment о 32-разрядном DLLs.

У Майкла Уошама есть несколько действительно хороших постов об использовании azure powershell cmdlets для диагностики и производительности azure. IMHO powershell-лучший способ пойти с azure.

Похожие вопросы:

Как включить счетчики производительности ODP.Net для моего веб-приложения. Я использую: .Net 2.0 Oracle 11г Windows 2008 R2

Я использую пакет Oracle Managed Data Access NuGet (Oracle.ManagedDataAccess) и хотел бы включить счетчики производительности Oracle. Они не отображаются монитором производительности, и я нашел.

Я пытаюсь создать некоторые пользовательские счетчики производительности в рабочей роли azure и веб-роли. Веб-роль правильно собирает и передает данные счетчика производительности из хранилища azure.

Я пытаюсь захватить следующий PerformanceCounters на Azure WebRole: private string[] perfCounters = < @Processor(_Total)% Processor Time, @ASP.NET Applications(__Total__)Requests/Sec.

Нам нужно включить 25 + счетчиков производительности в windows azure веб-ролях. Я думаю о RDP’ing и включаю их один за другим. Но это может занять много времени,а также не гарантировано, если мы.

У меня есть сервис azure cloud, который имеет высокие всплески трафика иногда через случайные промежутки времени. Эти всплески трафика могут длиться от 30 минут до 1 часа. Я зарегистрировался в.

Я создал несколько пользовательских счетчиков производительности в нашем приложении. Когда я развертываю приложение в Azure, я вижу, что счетчики собираются в WADPerformanceCountersTable , но я не.

Я пытался загрузить тест SignalR в свой сервис веб-приложений Azure (E.g. сколько соединений он может обработать, прежде чем подписка на вызовы концентратора начнет отказывать). Я обнаружил, что.

У меня есть логический sql server в Azure. Я выполняю запрос select * from sys.dm_os_performance_counters Он возвращает данные, но я подозреваю, что данные не только мои собственные, потому что.

Я использую счетчики производительности под названием Processor(_Total)% Processor Time, чтобы получить процент использования CPU из связанной учетной записи хранения. Но я проверяю данные.

Microsoft выпустила Windows 10 Build 18362.387 (Обновлено)

Компания Microsoft выпустила Windows 10 Build 18362.387 (KB4517211).

Update: Некоторые пользователи сообщают, что обновление KB4517211 ломает Windows Search и VMWare Workstation Pro.

Узнать другие подробности можно здесь.

Вот полный список исправлений:

• Исправлена проблема, которая приводила к увеличению вертикальных шрифтов при печати на принтере PostScript;
• Исправлена проблема, которая приводила к сбою печати из 32-разрядных приложений с ошибкой «Доступ запрещен» при выборе «Запустить от имени другого пользователя для приложения»;
• Исправлена проблема, которая могла дать доступ на запись на съемный USB-диск, когда пользователь переключается с привилегированного пользователя на непривилегированного пользователя;
• Исправлена проблема, из-за которой служба lsass.exe переставала работать, что приводило к завершению работы системы. Это происходило при переносе учетных данных Data Protection API (DPAPI) с помощью dpapimig.exe с параметром -domain;
• Исправлена проблема, которая давала пользователю Windows Hello for Business два сертификата для проверки подлинности при обновлении сертификата вместо одного сертификата;
• Исправлена проблема, которая препятствовала безопасному подключению веб-браузера к Windows Server. Это происходило при использовании сертификата проверки подлинности клиента, такого как сертификат на базе SHA512, и веб-браузер не поддерживает алгоритм подписи, соответствующий сертификату;
• Исправлена проблема, которая могла привести к сбою проверки подлинности для проверки подлинности на базесертификатов, когда проверка подлинности сертификата включает cname как часть запроса предварительной проверки подлинности;
• Исправлена проблема, которая препятствовала открытию приложения App-V и отображала ошибку сетевого сбоя. Эта проблема возникала при определенных обстоятельствах, например, когда батарея системы разряжена или произошел неожиданный сбой питания;
• Исправлена проблема, которая вызывала запрос запроса класса Win32_LogonSession для StartTime для отображения значения эпохи (например, 1-1-1601 1:00:00) вместо фактического времени входа в систему. Это происходило, когда пользователь, не являющийся администратором, создавал запрос запроса;
• Исправлена проблема, из-за которой проводник показывал обычную иконку файла для файлов, помеченных FILE_ATTRIBUTE_OFFLINE, а не ожидаемую иконку заполнителя;
• Исправлена проблема с периодическими отключениями Virtual Private Network (VPN) в сотовых сетях;
• Исправлена проблема, которая могла привести к сбою воспроизведения и записи звука при подключении к удаленной виртуальной машине;
• Исправлена проблема с MSCTF.dll, из-за которой приложение переставало работать;
• Исправлена проблема с вводом и отображением специальных символов, которая возникала, когда приложение использовало imm32.dll;
• Исправлена проблема с изменением размера приложений Windows Presentation Foundation (WPF); они могли не реагировать на изменение размера с помощью мыши, пока вы не отпустите кнопку мыши;
• Исправлена проблема, которая могла помешать обновлению более старых систем до новейших операционных систем из-за ошибки в драйвере дисплея более старых версий;
• Исправлена проблема, из-за которой цвет экрана мог стать белым на ноутбуках, которые имеют экраны с поддержкой High-Dynamic-Range (HDR);
• Исправлена проблема с преобразованием приложения из 32-разрядной в 64-разрядную архитектуру;
• Исправлена проблема, которая препятствовала запуску Active Directory Diagnostics Data Collector Set из монитора производительности для контроллеров домена. Это приводило к тому, что имя Data Collector Set отображалось пустым. Запуск Active Directory Diagnostics Data Collector Set возвращал ошибку: «Система не может найти указанный файл». Идентификатор события 1023 регистрируется в источнике как Perflib и следующими сообщениями:
• «Windows не удается загрузить расширяемый счетчик DLL «C:Windowssystem32ntdsperf.dll» ;
• «Указанный модуль не может быть найден»;
• Исправлена проблема, из-за которой звук в некоторых играх тише или отличался от ожидаемого;
• Исправлена проблема, которая не позволяла Microsoft App-V правильно обрабатывать параметр CreateProcess API, что препятствовало открытию виртуального процесса;
• Исправлена проблема, из-за которой максимальная производительность центрального процессора (CPU) не включалась при выборе плана питания высокой производительности;
• Предоставляет способ настройки размера буфера чтения. Это позволяет устранить проблему с медленным временем загрузки при загрузке файла в общий ресурс Universal Naming Convention (UNC) с помощью функции Internet Information Services (IIS) Web Distributed Authoring and Versioning (WebDAV);
• Исправлена проблема, из-за которой устройство переставало работать при открытии файлов с сетевого диска, на котором включено кэширование на стороне клиента. Эта проблема могла возникать, когда на устройстве установлены определенные сторонние антивирусные продукты, а диск поддерживается сервером, который не является сервером Microsoft Server Message Block (SMB). Код ошибки: «0x27 RDR_FILE_SYSTEM»;
• Облегчает настройку устройств, управляемых параметрами Mobile Device Management (MDM), которые создаются при приёме ADMX. Вы можете обновить ранее принятый файл ADMX более новой версией, и вам не нужно удалять предыдущий файл ADMX. Это решение применяется ко всем приложениям, которые используют прием ADMX;

Читайте так же:
Обследование для установка общедомовых счетчиков

Узнать другие подробности можно здесь.

Библиотеку dll расширяемого счетчика

В операционной системе Microsoft Windows версии 3.1 после загрузки DLL-библиотека становилась как бы частью операционной системы. DLL-библиотека является модулем и находится в памяти в единственном экземпляре, содержит сегменты кода и ресурсы, а так же один сегмент данных (рис. 3.3). Можно сказать, что для DLL-библиотеки создается одна копия (instance), состоящая только из сегмента данных, и один модуль, состоящий из кода и ресурсов.

Рис. 3.3. Структура DLL-библиотеки в памяти

DLL-библиотека, в отличие от приложения, не имеет стека и очереди сообщения. Функции, расположенные в модуле DLL-библиотеки, выполняются в контексте вызвавшей их задачи. При этом они пользуются стеком копии приложения, так как собственного стека в DLL-библиотеке не предусмотрено. Тем не менее, в среде операционной системы Microsoft Windows версии 3.1 функции, расположенные в 16-разрядной DLL-библиотеке, пользуются сегментом данных, принадлежащей этой библиотеке, а не копии приложения.

Создавая приложения для операционной системы Microsoft Windows версии 3.1, вы делали DLL-библиотеки для коллективного использования ресурсов или данных, расположенных в сегменте данных библиотеки. Функции, входящие в состав 16-разрядной DLL-библиотеки, могут заказывать блоки памяти с атрибутом GMEM_SHARE. Такой блок памяти не принадлежит ни одному приложению и поэтому не освобождается автоматически при завершении работы приложения. Так как в Windows версии 3.1 все приложения используют общую глобальную память, блоки памяти с атрибутом GMEM_SHARE можно использовать для обмена данными между приложениями. Управлять таким обменом могут, например, функции, расположенные в соответствующей DLL-библиотеке.

Когда разные приложения, запущенные в среде операционной системы Microsoft Windows версии 3.1, обращались к одной и той же функции DLL-библиотеки, то они все использовали для этого один и тот же адрес. Это и понятно — так как все приложения работали на одной виртуальной машине, то все они находились в одном адресном пространстве.

Читайте так же:
Как считается цифры счетчика

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

Здесь мы обращаем ваше внимание на первое отличие механизма динамической компоновки в среде Microsoft Windows NT от аналогичного механизма для Microsoft Windows версии 3.1.

Отображение страниц DLL-библиотеки

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

На рис. 3.4 схематически показано отображение кода и данных DLL-библиотеки в адресные пространства двух приложений.

Рис. 3.4. Отображение DLL-библиотеки в адресные пространства двух процессов

На этом рисунке показано, что в глобальном пуле памяти находится один экземпляр кода DLL-библиотеки, который отображается в адресные пространства приложений (процессов). Что же касается данных DLL-библиотеки, то для каждого приложения в глобальном пуле создается отдельная область. Таким образом, различные приложения не могут в этом случае передавать друг другу данные через общую область данных DLL-библиотеки, как это можно было делать в среде операционной системы Microsoft Windows версии 3.1.

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

Заметим, что одна и та же функция DLL-библиотеки может отображаться на разные адреса в различные адресные пространства приложений. Это же относится к глобальным и статическим переменным DLL-библиотеки — они будут отображаться на разные адреса для различных приложений.

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

Кроме того, для каждой DLL‑библиотеки система ведет счетчик использования (usage count). Содержимое этого счетчика увеличивается при очередной загрузке библиотеки в память и уменьшается при освобождении библиотеки.

Когда содержимое счетчика использования DLL-библиотеки станет равным нулю, библиотека будет выгружена из памяти.

Обмен данными между приложениями через DLL-библиотеку

В среде операционной системы Microsoft Windows версии 3.1 существовала возможность обмена данными между различными работающими параллельно приложениями через область локальной кучи (local heap) DLL-библиотеки. Эта область находилась в сегменте данных DLL-библиотеки и потому была доступна всем приложениям.

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

Приложение также может сделать попытку изменить содержимое статической или глобальной переменной, с тем чтобы другие приложения могли прочитать новое значение. Однако этот способ передачи данных между приложениями не будет работать. Попытка изменения данных будет зафиксирована операционной сиситемой, которая создаст для этого приложения копию страницы памяти, в которой находится изменившиеся данные, с использованием механизма копирования при записи (copy-on-write). Мы рассказывали об этом механизме в предыдущем томе “Библиотеки системного программиста”.

Если по какой-либо причине вы не можете использовать для обмена данными между приложениями файлы, отображаемые на память, можно создать DLL-библиотеку с данными, имеющими атрибут SHARED.

Для этого прежде всего вы должны задать имя секции данных, которая будет использована для передачи данных между процессами. Это можно сделать с помощью прагмы транслятора data_seg:

Читайте так же:
Бизнес план по продажам счетчиков

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

Можно также указать ключ редактору связей:

Строка RWS определяет атрибуты секции: R — READ, W — WRITE, S — SHARED.

При обращении к глобальным переменным, расположенным в секции с атрибутом SHARED, процессы должны выполнять взаимную синхронизацию с использованием таких средств, как критические секции, объекты-события, семафоры.

Microsoft выпускает накопительное обновление kb4517511 для Windows 10 1903 — Новости — 2021

Table of Contents:

Сегодня Microsoft выпустила новое накопительное обновление для Windows 10 версии 1903, также известное как «Май 2019 обновление», в форме KB4517511. Ранее на этой неделе компания выпустила накопительные обновления Windows 10. Однако версия 1903 не была включена. Кроме того, Microsoft выпустила исправление для уязвимости безопасности IE для Windows 10. Сегодняшнее обновление содержит длинный список исправлений и улучшений и доступно для загрузки уже сейчас.

KB4517511 для Windows 10 1903

После установки KB4517211 ваша сборка будет увеличена до 18362.387 и включает следующие исправления:

  • Устраняет проблему, которая приводит к увеличению вертикальных шрифтов при печати на принтере PostScript. Устраняет проблему, которая приводит к сбою печати из 32-разрядных приложений с ошибкой «Доступ запрещен» при выборе Запускать от имени другого пользователя для приложения. Адреса проблема, которая может дать доступ на запись к съемному USB-диску, когда пользователь переключается с привилегированного пользователя на непривилегированного пользователя. Устраняет проблему, из-за которой перестает работать служба lsass.exe, что приводит к завершению работы системы. Это происходит при переносе учетных данных API защиты данных (DPAPI) с использованием dpapimig.exe с параметром — domain. Устраняет проблему, которая дает пользователю Windows Hello для бизнеса два сертификата для проверки подлинности при обновлении сертификата вместо одного сертификата. Устраняет проблему, предотвращающую веб-браузер от безопасного подключения к Windows Server. Это происходит при использовании сертификата проверки подлинности клиента, такого как сертификат на основе SHA512, и веб-браузер не поддерживает алгоритм подписи, который соответствует сертификату. Решает проблему, которая может привести к сбою проверки подлинности для проверки подлинности на основе сертификатов при проверке подлинности сертификата включает в себя cname как часть предварительной аутентификации request.Adress проблема, препятствующая открытию приложения Microsoft App-V и отображающая ошибку сетевого сбоя Эта проблема возникает при определенных обстоятельствах, например, когда батарея системы разряжена или произошел непредвиденный сбой питания. Устраняет проблему, которая вызывает запрос запроса класса Win32_LogonSession для StartTime для отображения значения эпохи (например, 1 -1-1601 1:00:00) вместо фактического времени входа в систему. Это происходит, когда пользователь, не являющийся администратором, создает запрос запроса. Решает проблему, из-за которой в Проводнике файлов отображается значок обычного файла для файлов, помеченных FILE_ATTRIBUTE_OFFLINE, вместо значка ожидаемого заполнителя. Решает проблему с прерывистой виртуальной частной сетью ( VPN) отключение в сотовых сетях. Устраняет проблему, которая может привести к сбою воспроизведения и записи звука при подключении к удаленной виртуальной машине. Устраняет проблему с MSCTF.dll, из-за которой приложение перестает работать. Устраняет проблему с вводом и отображением специальных символов, возникающих, когда приложение использует imm32.dll. Решает проблему с изменением размера приложений Windows Presentation Foundation (WPF); они могут не реагировать на изменение размера с помощью мыши до тех пор, пока вы не отпустите кнопку мыши. Устранена проблема, которая может помешать обновлению более старых систем до последних операционных систем из-за ошибки в драйвере дисплея более старых версий. Устраняет проблему, которая может вызвать цвет экрана становится белым на ноутбуках со встроенным экраном с высоким динамическим диапазоном (HDR). Решает проблему с преобразованием приложения из 32-разрядной в 64-разрядную архитектуру. Решает проблему, которая не позволяет запустить Набор сборщика данных диагностики Active Directory из системного монитора для контроллеров домена. В результате имя набора сборщиков данных будет пустым. При запуске набора сборщиков данных диагностики Active Directory выдается сообщение об ошибке «Системе не удается найти указанный файл». Событие с идентификатором 1023 регистрируется в источнике как Perflib и следующие сообщения:
    • «Windows не может загрузить библиотеку DLL расширяемого счетчика« C: Windows system32 ntdsperf.dll ».« Указанный модуль не найден ».

    Устраняет проблему, из-за которой звук в некоторых играх тише или отличается от ожидаемого. Устраняет проблему, которая не позволяет Microsoft App-V правильно обрабатывать параметр API CreateProcess, что препятствует открытию виртуального процесса. Устраняет проблему, из-за которой Максимальная производительность центрального процессора (ЦП) не включается при выборе плана питания высокой производительности. Предоставляет способ настройки размера буфера чтения. Это позволяет решить проблему с медленным временем загрузки при загрузке файла на общий ресурс Universal Naming Convention (UNC) с помощью функции веб-распределенного авторинга и управления версиями (WebDAV) служб IIS. Решает проблему, приводящую к тому, что устройство перестать работать при открытии файлов с сетевого диска, на котором включено кэширование на стороне клиента. Эта проблема может возникать, когда на устройстве установлены определенные сторонние антивирусные продукты, а диск поддерживается сервером, который не является сервером Microsoft Server Message Block (SMB). Код ошибки: «0x27 RDR_FILE_SYSTEM». Облегчает настройку устройств, управляемых настройками управления мобильными устройствами (MDM), которые создаются путем приема ADMX. Вы можете обновить ранее загруженный файл ADMX более новой версией, и вам не нужно удалять предыдущий файл ADMX. Это решение применяется ко всем приложениям, которые используют прием ADMX.

Сегодняшнее обновление не является обязательным и не будет установлено автоматически. Но если вы хотите оставаться в курсе событий, зайдите в Настройки> Обновление и безопасность> Центр обновления Windows и проверьте. Или вы можете вручную загрузить его из каталога Центра обновления Windows.

Существует несколько известных проблем, поэтому обязательно ознакомьтесь с примечаниями к выпуску Microsoft, чтобы узнать обо всех исправлениях, проблемах и обходных решениях.

Microsoft выпускает накопительное обновление kb4501375 для windows 10 за 1903 г.

Сегодня Microsoft выпускает новое накопительное обновление KB4501375 для Windows 10 1903 Май 2019 Обновление. Вот список новых исправлений и улучшений, включенных в обновление.

Microsoft выпускает накопительное обновление kb4512941 для Windows 10 1903

Корпорация Майкрософт выпустила новое накопительное обновление для Windows 10 Обновление от 1903 года до 2019 года, которое включает в себя ряд исправлений для ОС и добавленных вами версий до 18362,329.

Microsoft выпускает исправление для Windows 10 юбилейное обновление накопительное обновление

Microsoft выпустила исправление для своего последнего обновления для Windows 10 Anniversary Edition. Вот посмотрите на детали этого последнего обновления.

Как обновить Windows 10 до версии 1903 May 2019 Update (Октябрь 2021).

  • Как обновить Windows 10 до версии 1903 May 2019 Update (Октябрь 2021).

    Библиотеку dll расширяемого счетчика

    DLL — это сокращение от Dynamic Link Library (динамически загружаемая библиотека).

    С формальной точки зрения DLL — особым образом оформленный относительно независимый блок исполняемого кода.
    Особый способ оформления предполагает наличие в DLL так называемых секций импорта и экспорта. Секция экспорта указывает те идентификаторы объектов (функций, классов, переменных), доступ к которым предоставляет данная DLL. В этом случае мы говорим об экспортировании идентификаторов из DLL. В общем случае, именно секция экспорта предоставляет особый интерес для разработчиков. Хотя ничто не мешает реализовать DLL, которая не имеет данной секции, но, тем не менее, выполняет полезную работу.
    Относительная независимость связана с наличием/отсутствием секции импорта у DLL (т.е. секции, в которой описываются внешние зависимости данной DLL от других). Подавляющее большинство DLL (за исключением, быть может, DLL ресурсов) импортирует функции из системных DLL (kernel32.dll, user32.dll, gdi32.dll и др.). В большинстве случае при создании проекта в его опциях автоматически проставляется стандартный набор таких библиотек. Иногда в этот список необходимо добавить требующиеся для Ваших задач DLL (например, в случае использования библиотеки сокетов требуется дополнительно подключить библиотеку ws2_32.dll).
    «Исполняемый» код в DLL не предполагает автономного использования. Перед тем, как можно будет приступить к использованию, необходимо загрузить DLL в область памяти вызывающего процесса (т.е. DLL не может выполняться сама по себе — ей обязательно нужен клиент). Это явление носит название «проецирование DLL на адресное пространство процесса». И это не удивительно, если вспомнить тот факт, что процессор работает не только с регистрами, но и с адресами памяти. Поэтому каждому объекту DLL требуется свое место «под солнцем», чтобы иметь возможность быть выполненным при вызове. В конечном коде exe-файла, который генерирует компилятор, не будет инструкций процессора, соответствующих коду данной функции. Вместо этого будет сгенерирована инструкция вызова соответствующей функции (call). Так как DLL отображена на адресное пространство процесса, то код DLL будет легко доступен по call-вызову.
    Итак, формально, DLL — особым образом оформленный программный компонент, доступ к исполняемому коду которого приложение получает в момент старта (DLL неявной загрузки) или в момент использования (DLL явной и отложенной загрузки).

    Что же касается физического представления на диске, то разница между dll- и exe-файлами небольшая. Как динамически линкуемые библиотеки, так и исполняемые модули приложений в Windows имеют формат Portable Executable (PE-файл), однако вы не можете «запустить» DLL-библиотеку на выполнение, как обычное приложение. «Узнать» DLL-файл можно по его сигнатуре (заголовку): признаком библиотеки является установленный флаг IMAGE_FILE_DLL (13-й бит) в поле Characteristics заголовка IMAGE_FILE_HEADER (эти константы описаны в файле winnt.h; подробная информация о формате exe- и dll-файлов — см. MSDN «Microsoft Portable Executable and Common Object File Format Specification»). Кроме того, в заголовках файлов динамически линкуемых библиотек указан нулевой размер стека — это связано с тем, что функции DLL используют стек вызывающего приложения. DLL-файл может содержать как инструкции (команды процессора), так и данные (разделяемые ресурсы).
    В общем случае, файл, являющийся динамически загружаемой библиотекой, не обязан иметь расширение .dll. Например, известные файлы *.cpl — это не что иное, как DLL, используемые апплетом панели управления; *.ocx — DLL, содержащие внутрипроцессные (inproc) COM-объекты.

    Логическое (философское) представление DLL не имеет никаких ограничений. Удобно представлять себе DLL в виде сервера, который предлагает дополнительную функциональность Вашему приложению. Приложения, которые используют данную функциональность, являются клиентами DLL. Рисунок 1.1 показывает процесс взаимодействия приложения с DLL. После проецирования DLL на адресное пространство вызывающего процесса DLL становится частью этого процесса. Поэтому возможен абсолютно безболезненный вызов функций, экспортируемых DLL.

    Зачем нужны DLL?

    Предпосылки к появлению DLL

    Свою историю DLL ведут с средины 60-х годов прошлого столетия, однако по-настоящему широкое распространение динамически линкуемые библиотеки получили после появления операционной системы Windows.
    По крайней мере, доподлинно известно, что операционные системы Windows 3.1/3.11 уже содержали программы, использующие DLL. В связи с тем, что в те времена емкости оперативной памяти и жесткого диска были значительно меньше, чем сейчас, использование DLL предоставляло ряд преимуществ:

    • экономия дискового пространства за счет многократного использования кода (reusing). Если приложения используют один и тот же код, нет необходимости поставлять его в коде каждого приложения. Достаточно разработать DLL.
    • экономия физической памяти (RAM) за счет загрузки в нее единственного экземпляра DLL. Именно тогда появились счетчики ссылок пользователей DLL — при каждом вызове функции ОС проверяет наличие загруженного в память экземпляра библиотеки. В случае положительного ответа счетчик ссылок пользователей данной DLL увеличивается на единицу. Если же экземпляр данной DLL в памяти не обнаружен, то операционная система загружает файл в память и присваивает счетчику значение «1». Механизм разделения кода носит название memory mapping (отображение в память). При выгрузке DLL из памяти уменьшается значение счетчика числа пользователей, в случае равенства его нулю DLL немедленно выгружается.
    • изолирование и модификация кода DLL независимо от остального кода программы. Например, код визуализации изолируется от математической части. При изменении математического аппарата (например, при разработке нового, более быстрого алгоритма) перекомпиляция кода клиентского приложения (отвечающего за визуализацию результатов) не требуется. Этот фактор может играть значительную роль в том случае, если число клиентов достаточно велико.

    Самое удивительное (время не стоит на месте!), что ранее политика Microsoft позволяла (и даже приветствовала) размещение DLL в системных директориях (таких как WindowsSystem, WindowsSystem32). Это порождало периодические проблемы конфликта версий при замене DLL (см. раздел «DLL Hell»). В связи с этим (а также с ростом емкости запоминающих устройств и соответствующим снижением цены на них) на данный момент политика Microsoft изменена на прямо противоположную — Microsoft настоятельно рекомендует хранить все используемые DLL в рабочем каталоге программы и лишь в случае острой необходимости пользоваться системными директориями.

    Зачем нужны DLL сейчас?

    Основные направления использования DLL:

    • всевозможные модули расширения функциональности приложений — так называемые plug-in (см. пример с MatLab, Far и пр.);
    • локализация приложения (подробнее об этом в разделе «DLL, содержащие только ресурсы»);
    • разделение объектов абстракции (функций, классов и пр.) между приложениями;
    • независимость модификации кода — DLL может быть в любой момент переписана с сохранением экспортируемых интерфейсов;
    • реализация определенных действий, которые можно совершить только при помощи DLL — см. раздел «Перехват API-вызовов»;
    • хранилище ресурсов с возможностью независимого изменения этих ресурсов.

    Кстати, DLL широко используются в технологии COM (а до этого в OLE 1.0) — в качестве основы при построении так называемых inproc-серверов (внутрипроцессных серверов) используются DLL. Это позволяет упростить взаимодействие с приложением, благодаря загрузке используемых ActiveX объектов в адресное пространство клиента. В этом случае накладные расходы, связанные с преодолением границ адресных пространств при передаче данных (параметров функций и т.д.) — так называемый marshalling, сводятся к нулю.
    Все те абстракции, с которыми Вы работаете в повседневной программистской жизни, могут быть внедрены в DLL — классы, объекты, таймеры, потоки, функции и пр. Другое дело, что не всегда удобно и правильно работать с этими объектами вне DLL (см. например «Использование STL в DLL»). Связано это с тем, что не всегда логическое представление того или иного объекта может быть однозначно представлено (переведено) в физическое. Да-да, Вы не ослышались — использование DLL не налагает ограничений на используемый язык (точнее — почти не налагает!). Более того, как правило, DLL разрабатывается на другом языке программирования, нежели тот, который используется при ее загрузке. Приведем пример: разрабатывался математический проект, код которого реализовывался на M-языке среды MatLab (Matrix Laboratory). M-язык по своей природе является интерпретируемым языком программирования. После этого полученные алгоритмы были реализованы при помощи языка C++ и скомпилированы в DLL, которая также использовалась средой MatLab.

    Что лучше: один EXE-файл и никаких DLL или компактный EXE-файл и много DLL?

    голоса
    Рейтинг статьи
  • Ссылка на основную публикацию