ПРОГРАММИРОВАНИЕ    НА    V I S U A L   C + +
РАССЫЛКА САЙТА       
RSDN.RU  

    Выпуск No. 93 от 26 мая 2003 г.
   
Подписчиков: 21383 (+85) 

РАССЫЛКА ЯВЛЯЕТСЯ ЧАСТЬЮ ПРОЕКТА RSDN , НА САЙТЕ КОТОРОГО ВСЕГДА МОЖНО НАЙТИ ВСЮ НЕОБХОДИМУЮ РАЗРАБОТЧИКУ ИНФОРМАЦИЮ, СТАТЬИ, ФОРУМЫ, РЕСУРСЫ, ПОЛНЫЙ АРХИВ ПРЕДЫДУЩИХ ВЫПУСКОВ РАССЫЛКИ И МНОГОЕ ДРУГОЕ.

Здравствуйте, дорогие читатели!


 CТАТЬЯ

.NET - Проблема распространения приложений

Задача

Вопрос распространения (deploying) приложения требует к себе не менее серьезного внимания, чем проектирование и кодирование. Впечатление от приложения в целом складывается, в том числе, и из самого первого шага - инсталляции. В идеале, установка приложения должна требовать от пользователя лишь самого минимального участия. Можно сказать, что хорошая программа установки характеризуется следующими критериями (см. The Windows User Experience - Design Specifications and Guidelines - Integrating with the System - Installation):

  • Запуск программы установки происходит один раз
  • Программа установки имеет имя Setup.exe или Install.exe, и ее легко найти среди файлов установки
  • Если программа распространяется на CD, то вставка диска в привод приводит к автоматическому запуску установки
  • Весь процесс установки можно пройти, нажимая Enter. Это означает, что каждый шаг должен предполагать вариант по умолчанию.
  • Информация, показанная при установке, необходима и достаточна. Не полагайтесь на то, что пользователь будет читать README-файл. Сначала он запустит Setup.exe и обратится к документации лишь в случае, когда столкнется с серьезными проблемами при установке.
  • Одна программа установки работает на всех поддерживаемых приложением версиях операционной системы

Здесь мы будем рассматривать проблему применительно лишь к приложениям Windows Forms. К моему глубокому сожалению, данная статья не решает проблему в целом. Ее можно рассматривать как своего рода TODO - набор пунктов, которые нужно учитывать при подготовке инсталлера.

Что нужно установить
.NET Framework

Итак, что должно быть установлено? Как минимум, это .NET Framework и файлы вашего приложения, а также - компоненты, используемые вашим приложением.

ПРИМЕЧАНИЕ

Что такое .NET Framework? Если вы еще не разобрались, то это (отбросив тонну рекламной шелухи) - набор библиотек, обеспечивающих среду функционирования управляемых (managed) приложений - common language runtime (CLR). Для тех, кто программирует на Java здесь можно провести аналогию с Java Runtime Environment (JRE).

Требование установки .NET Framework определяет список версий Windows, на которых будет работать ваше приложение (см. .NET Framework System Requirements и Microsoft .NET Framework: System Requirements for the .NET Framework 1.1):

  • Windows 98
  • Windows 98 Second Edition
  • Windows Millennium Edition
  • Windows NT 4.0 Workstation / Server with Service Pack 6.0a or later
  • Windows 2000 Professional / Server / Advanced Server
  • Windows XP Home / Professional
  • Windows 2003 Server family (.NET Framework version 1.1 is installed as part of the operating system)

Для установки .NET Framework необходим Internet Explorer версии 5.01 или выше и Windows Installer 2.0 или выше. Поскольку IE 5.01 впервые появился в Windows 2000, то обновление браузера (если он еще не был обновлен), потребуется в Windows 98, 98 SE и NT 4.0. Требование к Windows Installer можно не учитывать, поскольку .NET Framework при установке производит обновление этого компонента.

ПРИМЕЧАНИЕ

Если быть точным, то программа установки .NET Framework - dotnetfx.exe - проверяет, что IE имеет версию не ниже 5.0.2919.6307. Вы можете убедиться в этом, посмотрев в файл dotNetFx.log во временном каталоге Windows. Он содержит протокол установки файла dotnetfx.exe с описанием всех выполненных проверок. Способ определения версии IE приведен здесь: How to Determine Which Version of Internet Explorer Is Installed.

На момент написания данной статьи наиболее свежая версия .NET Framework - 1.1. Рекомендую вам использовать самую последнюю версию - я уже имел счастье столкнуться с некоторыми ошибками в версии 1.0.

В Visual Studio .NET довольно легко создать Setup Project и настроить его так, чтобы пакет установки включал в себя результат компиляции вашей программы. Этот процесс подробно описан в документации на Visual Studio .NET (см. напр. Walkthrough: Deploying a Windows Application).

Здесь нас поджидает первая сложность. Вы могли заметить, что в любом Setup Project, включающем программу на .NET, в список зависимостей автоматически включается файл Dotnetfxredist_x86_enu.msm, который по умолчанию отмечен как исключенный (excluded) из результирующего setup package. При сборке setup выдается сообщение:


WARNING: This setup does not contain the .NET Framework which must be installed
on the target machine by running dotnetfx.exe before this setup will install.
You can find dotnetfx.exe on the Visual Studio .NET 'Windows Components Update'
media. Dotnetfx.exe can be redistributed with your setup.

Если вы попробуете включить его, то получите сообщение об ошибке:


ERROR: dotNETFXRedist_x86_enu.msm must not be used to redistribute the .NET Framework.
Please exclude this merge module.

Вероятно, сначала предполагалась включать таким образом .NET Framework в состав инсталляций (например, в QA из MSDN Magazine 2001'09 так и говорится). Но сейчас этот merge module используется только с одной целью: он предотвращает от автоматического включения в проект некоторых DLL, входящих в CLR - например, MSCOREE.DLL.

Таким образом, сейчас .NET Framework не может быть объединен с инсталляцией вашей программы непосредственно - в одном .MSI-файле. Существует, однако, как минимум одно решение данной проблемы - Microsoft предлагает Sample Bootstrapper - программу запуска инсталляции, заменяющую стандартный Setup.exe (см. Microsoft .NET Framework Setup.exe Bootstrapper Sample и bootstrapper_sample.exe). Этот измененный загрузчик сначала запускает установку DOTNETFX.EXE (если это необходимо), а уже затем - установку .MSI-файла вашего приложения.

См. также: .NET Framework Deployment Guide, .NET Framework Support on Windows Operating Systems.

MDAC

Если ваше приложение использует доступ к базе данных (т.е. если оно пользуется System.Data namespace), потребуется установка Microsoft Data Access Components (MDAC) версии 2.6 или выше (при работе, классы System.Data проверяют что версия MDAC не ниже 2.6.6526). MDAC распространяется в виде файла установки MDAC_TYP.EXE. Здесь проблема та же что и с .NET Framework - как установить и MDAC, и приложение, используя один инсталлятор. По этому поводу имеется статья: FILE: Install DCOM and MDAC Through a Windows Installer Package. Вы также можете защитить свой инсталлятор от запуска в случае если MDAC не установлен: Adding a Launch Condition for Microsoft Data Access Components.

Несмотря на требование установки MDAC 2.6, рекомендуется ставить версию 2.7 - это та же версия, что ставится с Visual Studio .NET, а значит, именно на ней вы разрабатываете и тестируете ваше приложение. Кроме того, нет смысла ставить MDAC версии ниже 2.7 на Windows 2000 и Windows XP.

Jet

Добавлю еще пару слов о Jet Driver (он используется для доступа к базам MS Access, расширение файла - MDB). В настоящее время Jet Driver уже считается "legacy software" - на смену ему предлагается использовать MSDE. Начиная с MDAC версии 2.6, Jet Driver не входит в состав этого дистрибутива, и его требуется устанавливать отдельно: INFO: MDAC Version 2.6 and Later Do Not Contain Jet or Desktop ODBC Drivers.

На download.microsoft.com имеется Jet 4.0 SP3 сразу для всех версий Windows - Jet 4.0 Service Pack 3 Update (Jet40SP3_Comp.exe) и четыре варианта Jet 4.0 SP6 - для разных версий Windows - ACC2002: Updated Version of Microsoft Jet 4.0 Available in Download Center.

Crystal Reports

Для работы отчетов Crystal Reports (CR) на машине клиента должен быть установлен Crystal Reports Free Runtime - набор библиотек и лицензия. В проект инсталляции нужно добавить файлы, содержащие эти библиотеки (см. Distributing Crystal Runtime Files to a Client Computer):

  • managed.msm
  • database_access.msm
  • database_access_enu.msm
  • regwiz.msm

Если ваши отчеты используют ADO.NET datasets, то помимо этого требуется подключить VC_CRT.msm и VC_STL.msm - настройте их на установку в системный каталог Windows.

Для корректной установки лицензии нужно прописать номер лицензии в свойствах regwiz.msm (в свойствах: Merge module properties - License Key). Номер лицензии можно узнать в окне About среды Visual Studio .NET. Очень рекомендую внимательно прочитать документ Crystal Reports for Visual Studio .NET Application Deployment - это поможет избежать многих проблем (ищите его под именем crnet_deployment.pdf на http://support.crystaldecisions.com/docs/).

Наконец, чтобы исправились некоторые ошибки CR (например, проблемы с экспортом в PDF), рекомендую установить (и у себя, и на машине клиенте) пакет актуальных обновлений - Crystal Reports for Visual Studio .NET Monthly Hot Fix (English). Этот пакет обновляется ежемесячно. При установке он обновляет только файлы CR Free Runtime, не обновляя MSM-файлы. К сожалению, мне неизвестен способ, который позволил бы включить файлы этого пакета обновлений в merge modules.

И еще один момент, связанный с Crystal Reports. Если на машине клиента стоит Windows 98/Me и Internet Explorer версии меньше чем 6.0, то после инсталляции могут возникнуть проблемы с созданием отчетов. Дело здесь в ATL.dll. При инсталляции некоторые из библиотек CR саморегистрируется, что требует их загрузки. Одна из этих библиотек (CRQE.dll) связана с ATL.dll и требует версию 3.0.8849 этой библиотеки (которая устанавливается с IE6). При отсутствии нужной версии ATL.dll, регистрация не проходит и соответствующие COM-объекты оказываются недоступны. Таким образом, рекомендуется включить ATL.msm в состав инсталлятора (подробнее см. Err Msg: "Load Report Failed" after deploying .NET app to Windows 98 / ME).

В целом

Предположим, что наше приложение написано на Windows Forms, работает с базой данных MS Access и использует Crystal Reports для создания и печати отчетов. Посмотрим, что нам потребуется установить (по максимуму):

Internet Explorer 5.01
.NET Framework 23Mb dotnetfx.exe
MDAC 5Mb mdac_typ.exe
Jet Driver 4Mb jet40sp3_comp.exe
Crystal Reports Free Run-Time 7Mb merge modules
Crystal Reports for VS.NET Hot-Fix 8Mb cr10netwin_en_200303.exe
Ваше приложение
Другие компоненты, используемые вашим приложением

Итого - 47Mb плюс само приложение. Это определенно много для того чтобы скачать это через Интернет по модемной линии. Но при этом такого объема даже мало для программы, распространяемой на CD.

Для распространения через Интернет можно порекомендовать включить в пакет установки только самое необходимое - само приложение и CR Free Runtime. На странице, откуда скачивается программа, подробно описать - что должно быть установлено для нормальной работы и откуда можно скачать недостающие компоненты. Первой же ссылкой должен быть адрес для загрузки последней версии .NET Framework.

При распространении на CD лучше включить все что в принципе может понадобиться - различные версии IE, отдельный компонент для обновления Windows Installer, обновление Jet до версии 4.0 SP6 и т.п. Не забудьте также написать autorun.inf для автоматического запуска инсталляции.

Итак, я здесь так и не показал решения основной проблемы - как создать пакет инсталляции, устанавливающий все нужные компоненты одним запуском setup.exe. Конечно, решение будет сильно зависеть от средств, которые вы будете использовать для создания инсталлятора. Но думаю, что я, по крайней мере, поставил эту проблему. А хорошо поставленная проблема - это уже половина решения ;-)

Практика

Перейдем к практической части.

Итак, нам нужно, чтобы пользователю не приходилось читать README и запускать EXE-файлы в строго определенной последовательности. Вместо этого должен быть SETUP.EXE, который проверит все условия и запустит на установку именно то, что необходимо. Этого достаточно - поскольку все компоненты умеют устанавливать себя сами.

Для обеспечения требуемой функциональности можно использовать практически любой инструмент. От него требуются возможности: определение наличия файла, определение версии DLL, чтение веток реестра, запуск программы с ожиданием ее завершения.

Среди всего многообразия продуктов подобного рода, для своей задачи я выбрал NSIS фирмы nullSoft. Этот инструмент применяется для создания инсталлера к WinAmp и плагинов к нему. Он бесплатен. Основан на простом скриптовом языке, выразительные возможности которого не очень широки, но вполне достаточны для наших целей. В результате компиляции скрипта получается EXE-файл небольшого размера (в моем случае все уместилось в 50Kb). Интерфейс инсталлера можно настроить, в частности, есть возможность сделать его похожим на стандартный мастер Windows Installer.

Условная установка компонентов

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

Установка .NET Framework

В первую очередь, нам нужно проверять, подходит ли окружение для установки .NET Framework. А именно, нас интересует версия Windows и версия Internet Explorer.


    Допустимые версии Windows:
      Windows 98/98SE 
      Windows ME
      Windows NT 4.0 - только с SP6.0a или выше
      Windows 2000
      Windows XP
      Windows 2003 Server
    Недопустимые версии Windows:
      Windows 95
      Windows NT 3.5/3.51
      Windows NT 4.0 - без SP6a

Для определения версии Windows можно воспользоваться функциями Windows API. Другой путь состоит в получении значений из реестра:


для ряда Windows NT/2000/XP/2003:
  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
  ключ CurrentVersion
для Windows 9x/ME:
  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
  ключ VersionNumber

Версию Service Pack также можно найти в реестре:


  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
  ключ CSDVersion (String), значение - "Service Pack X"
  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows
  ключ CSDVersion (DWORD), значение - 0x100, 0x200...

Точную версию Internet Explorer можно определить по версии файла Shdocvw.dll, лежащей в системной папке Windows. Напомню, нам требуется версия IE не ниже 5.0.2919.6307.

Далее, нужно проверить, установлен ли уже .NET Framework. Если установлен, нас интересует его версия. На отдельной машине может быть установлено сразу несколько версий .NET Framework. Если необходимой версии среди них еще нет - ее нужно установить. Для получения информации об установленных версиях также используем реестр:


  HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework
  ключ InstallRoot - директория, куда устанавливается .NET Framework -
  обычно это C:\WINNT\Microsoft.NET\Framework\

Если такой директории на диске нет, то .NET Framework не установлен.


  HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\Policy
  суб-ключи вида \vX.X содержат информацию об установленных версиях .NET Framework

Используя значение InstallRoot, а также ключ, лежащий в ветке Policy и содержимое ветки с этим ключом, мы получаем полный путь к файлам соответствующей версии framework. Например, если у вас установлен .NET Framework версий 1.0 и 1.1 Final Beta, то каталог InstallRoot будет содержать два подкаталога:


C:\WINNT\Microsoft.Net\Framework\v1.0.3705
C:\WINNT\Microsoft.Net\Framework\v1.1.4322

Более точно о версии framework можно судить по версии файла MSCORCFG.DLL, лежащем в каталоге соответствующей версии .NET Framework:


    .NET Framework Mscorcfg.dll  Product
    -------------- ------------  -------
    1.0.3705       1.0.3705.0    .NET Framework 1.0             Feb 2002
    1.0.3705       1.0.3705.209  .NET Framework 1.0 SP1
    1.0.3705       1.0.3705.288  .NET Framework 1.0 SP2
    1.1.4322       1.1.4322.510  .NET Framework 1.1 Final Beta
    1.1.4322       1.1.4322.573  .NET Framework 1.1             Apr 2003

Установка MDAC

Допустим, что со своей программой мы будем распространять MDAC 2.7 SP1. Единственное что нужно проверить - установлен ли MDAC нужной версии или нет. MDAC может быть поставлен в 98/98SE/ME/NT40/2000. Но его нельзя ставить в XP - там уже стоит MDAC 2.7. Версию MDAC получаем по реестру:


HKEY_LOCAL_MACHINE\Software\Microsoft\DataAccess
ключ FullInstallVer

Для Windows XP этот ключ имеет значение "2.70.7713.0".

Установка Jet

Будем считать, что с программой мы используем MS Jet 4.0 SP3. Нужно убедиться, что Jet нужной версии уже установлен, и установить его при необходимости. Один из ключевых файлов Jet - MSJET40.DLL, находящийся в системном каталоге Windows. По информации из MSDN получаем следующую таблицу версий:


    msjet40.dll  Product
    -----------  -------
    4.0.2115.28  MDAC 2.1
    4.0.2510.0   MDAC 2.1 SP1
    4.0.2521.8   MDAC 2.1 SP1 (GA); Windows 98SE
    4.0.2927.2   MDAC 2.1 SP2 (GA)
    4.0.2927.4   MDAC 2.5 RTM; Windows 2000; Windows Me; Jet 4.0 (SP3)
    4.0.2927.17  MDAC 2.5 SP1; Office 2000 SR1/SR1a; Windows 2000 SP1
    4.0.4331.1   Windows 2000 SP2
    4.0.4431.3   Windows 2000 SP2/MDAC 2.5 SP2
    4.0.4431.4   MDAC 2.5 SP2
    4.0.6218.0   Jet 4.0 SP6
    -            MDAC 2.6
    -            MDAC 2.6 SP1
    -            MDAC 2.7

Таким образом, данную версию Jet нужно устанавливать в Windows 98 / Windows NT 4.0 и не нужно - в Windows Me / Windows 2000 - там он уже стоит. Перед установкой Jet 4.0 SP3 уже должен быть установлен MDAC 2.6 или выше.

Заключение

Остается "всего лишь" реализовать все необходимые проверки в рамках используемого вами инструмента для создания инсталляторов. По нескольким причинам мне не хотелось бы приводить здесь готовое решение. Надеюсь, я дал всю (или хотя бы - почти всю) необходимую информацию для того чтобы понять проблему и увидеть направление, в котором находится решение.



Ведущий рассылки: Алекс Jenter   jenter@rsdn.ru
Публикуемые в рассылке материалы принадлежат сайту RSDN.

| Предыдущие выпуски     | Статистика рассылки