Road to hell. DLL hell

Завершена работа над новым обновлением IBProvider — v5.9. Сборка 33077, загруженная на сайт, с очень высокой долей вероятности уйдет в релиз. Одновременно будет выпущено обновление LCPI OLE DB Services v1.12.

Основное изменение — в сборках vc16 (VS2019) пул потоков выделен в самостоятельную DLL, которую будут одновременно использовать и IBProvider и сервисы OLE DB.

Схема использования lcpi.infrastructure.multitasking.ibp

Пожалуй, здесь стоит перечислить, для каких задач используются потоки.

Провайдер:

  • Пул запросов
  • Асинхронная загрузка множеств
  • Асинхронные уведомления
  • Обслуживание файлового буфера значений OUT-параметров с блобами
  • Обслуживание файлового буфера с результирующим множеством
  • Уборка мусора обновляемого множества

Сервисы OLE DB:

  • Пул подключений

DLL с пулом потоков представляет собой библиотеку с C++ классами. В дистрибутивы включены заголовочные файлы и LIB. Так что, при желании — эту DLL можно использовать отдельно. Разумеется только в проектах на C++, собранных в VS2015-VS2019 — эти студии используют совместимую друг с другом CRT.

Сборки провайдера vc12xp, vc14xp и vc15 продолжают использовать встроенный менеджер потоков. То же самое касается сборок vc12xp/vc15 сервисов OLE DB.

Реализации внешнего пула и внутреннего немного отличаются друг от друга. Хотя обе опираются на одни и те же интерфейсы. Во внешнем пуле пришлось учитывать проблемы безопасности повторного использования потоков.

Во все сборки добавлен ресурс LCPI_BINARY_INFO, в котором описываются связанные модули и их версии. Вот данные из lcpi.ibprovider-v5_vc16_w64_prof_i.dll:

<?xml version="1.0" encoding="UTF-8"?>
<BinaryInfo Version="1.0">
  <References>
    <Reference Name="lcpi.infrastructure.core-v01_vc16_w64_i.dll" Version="1.0.0.45" />
    <Reference Name="lcpi.infrastructure.multitasking.ibp-v02_vc16_w64_i.dll" Version="2.0.0.279" />
  </References>
</BinaryInfo>

При желании, опираясь на эти данные, можно организовать автоматизированный контроль версий модулей.


Как по мне, версия IBProvider v5.9 представляет собой переход на следующий уровень проекта.

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

Дальнейшее развитие этой темы подразумевает установку общих DLL в каталог Windows\WinSxS. Это позволит задействовать встроенный в Windows механизм управления версиями модулей. Но для этого нужно сначала начать подписывать сборки — а я пока только морально готовлюсь сделать этот шаг.

Так что вот. Такие дела. Творятся на нашей лужайке.

Leave a Comment