четверг, 4 сентября 2008 г.

Microsoft runtime и Firebird Embeded 2.1.1

Для возможности x64 билдов разработчики Firebird перешли на vc8, что потянуло за собой, в принципе уже привычную, проблему распространения vc runtime.

Но учитывая теперешний зоопарк ОС, технологий совместимости 32/64, попыток решения dll хелл, и вообще постижения Дао от МС, деплоймент этого runtime становится очень непростым.

Он, рантайм 8-ой версии, не идет, пока, в поставки никакх ОС - и Висте его тоже нет(по меньшей мере до SP).

Первое - для правильной установки, как это рекомендует МС, нужны права Администратора. А для установки на win2k до SP1 - обновление инсталятора МС до 3.1

Для интеграции этого redist себе в инсталятор - нужно делать msi инсталяторы, создание которых в корректном виде не самое простое занятие, для котрого хороших
свободных инструментов вроде как и нет, и опять таки необходимы права администратора.

В принципе на первый вгляд проблем быть не должно - что стоит поставить этот рантайм,
когда разворачивается сервер СУБД. Но тем, кто пытается распространять shareware системы, особенно с FB embeded, приходится хуже - необходимо тянуть этот рантайм со своим приложением.

Есть три пути его поставки:
  1. Официальный.
    Устанавливаем инсталятором от MS и все работает. Не подходит, если нет гарантии наличия админских прав у пользователей, наличия Windows Installer 3.0 or later, portable решения.
  2. Экстенсивный.
    Поставляем со своим приложением просто необходимые бинарники рантайма. Так делает, впрочем, большинство софта - стоит только поискать msvcr80.dll по жесткому диску :)). Но, поставлять нужно ТРИ копии рантайма, одну для работы самого fbembed, вторую в каталоге intl для fbintl и третью в для подключаемых функций в каталоге udf.
  3. Хитро-экстенсивный.
    Пользуясь текстовой природой манифестов, в каталогах intl и udf оставить только манифест, с измененными путями к файлам вида:

    <file name="..\msvcr80.dll">
    <file name="..\msvcp80.dll">

    ВАЖНО, в таком случае указать в манифесте своего приложения зависимость от Microsoft.VC80.CRT.

    такой манифест представляет собой текстовый файл <FullAppName>.manifest с содержимым:
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <dependency>
    <dependentAssembly>
    <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
    </dependency>
    </assembly>

    Этот манифест можно включить в ресурсы самого приложения, см. например


Ссылки:

5 комментариев:

Анонимный комментирует...

> для установки на win2k до SP1 - обновление инсталятора МС до 3.1

На W2K рантайм можно ставить как и раньше - копированием dll в system32

Анонимный комментирует...

Сделал все как написано у вас в статье, но к сожалению не заработало, может я что-то не понимаю, но пробовал двумя методами, кидал библиотеки рантайма в папки intl и udf, не сработало, в логе пишет что не может загрузить fbintl.dll. Та же ситуация при создании в этих папках манифеста, манифесту присвоено имя Имя_программы.exe.manifest. Сама база создана с полями в кодировке WIN1251. В чем еще может быть проблема?

pnv82 комментирует...

Сейчас(начиная с 2.1.2), спасибо Владу, проблема решена системно - FB достаточно рантайма, который лежит рядом с fbembed.dll.

Если все ж интересна причина вашей проблемы - распишите точное содержимое каталогов и тексты манифестов, подозреваю что какую-то мелочь все же упускали(манифесты рантайма, к примеру, в каталоги копировали?)

Анонимный комментирует...

Вы правы, манифесты рантайма не скопировал в папки, по этому и не помогало. Спасибо большое за подсказку, сам бы наверное еще долго разбирался :), а вообще имеет смысл перейти на версию 2.1.2 пожалй :)

pnv82 комментирует...

Однозначно стоит - релиз не за горами, а несколько неприятных вещей там поправлено.
Ну и загрузка рантайма многого стоит :)