Road to hell. DLL hell
Завершена работа над новым обновлением IBProvider — v5.9. Сборка 33077, загруженная на сайт, с очень высокой долей вероятности уйдет в релиз. Одновременно будет выпущено обновление LCPI OLE DB Services v1.12.
Основное изменение — в сборках vc16 (VS2019) пул потоков выделен в самостоятельную DLL, которую будут одновременно использовать и IBProvider и сервисы OLE DB.
Пожалуй, здесь стоит перечислить, для каких задач используются потоки.
Провайдер:
- Пул запросов
- Асинхронная загрузка множеств
- Асинхронные уведомления
- Обслуживание файлового буфера значений 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 механизм управления версиями модулей. Но для этого нужно сначала начать подписывать сборки — а я пока только морально готовлюсь сделать этот шаг.
Так что вот. Такие дела. Творятся на нашей лужайке.