November 10, 2006

Как я .Net запускал

Высшее командование поставило давеча передо мной задачу: проверять наличие и версию .Net Framework при запуске приложения. Первое время я пребывал в состоянии лёгкого ступора, так как задача показалась мне интересной. Сразу придумалась аналогия: при запуске Win32 приложения проверять наличие и версию Win32 API, нет! наличие и версию Windows. Аналогия, имхо, совершенно приемлимая, так как .Net выступает как платформа. Короче говоря, сначала я подумал, что от меня требуют невозможного, да и по памяти, нормальной практикой является проверка соответствия system requirements в момент установки приложения, а не его запуска.

Ладно. Первый шок вроде прошёл. Начинаем мыслить. Проверять версию ладно, это наверняка предусмотрено разработчиками из Microsoft (MSDN подтвердил, что так и есть). Достаточно добавить в App.config пару строк. Но вот как быть с проверкой на наличие...

Для начала хочу обратить внимание, что исполняемый файл для .Net имеет всё то же разрешение .exe. В отличие, скажем, от Java, где всё это происходит посредством launcher'а. Тут несложно догадаться, что разработчики Microsoft придумали некий механизм, чтобы встроить инициализацию среды исполнения непосредственно в исполняемый файл. Хорошее решение, правда только для Windows, но всё равно удобно. А конечному пользователю только того и надо, чтобы было удобно.

Здесь следует отметить, что мне очень повезло. Совсем недавно я начал читать творение Patric Smacchia, а там как раз с самого начала написано что да как. Да! В любой книге по разработке на .Net с самого начала есть разбор формата сборки. Но! Совершенно нигде более я не встречал, чтобы автор описывал (особенно с самого начала книги) подробно весь механизм инициализации CLR.

Оказалось, что существует некий COM компонент, реализующий интерфейс ICLRRuntimeHost. Кроме того, есть API, позволяющий создать экземпляр хоста и попросить его выполнить managed код из требуемой сборки. Всё. Довольно просто, если знать что делать.

Могу только догадываться, что похожий механизм используестя и при создании .exe файлов для запуска Java приложений, но там это скорее надстройка над системой, а тут это именно система. Это радует.

Но! В каждой бочке мёда, как известно, должно быть немного инородной субстанции. Функция API (на который я ссылался чуть раньше), отвечающая за загрузку нужной версии CLR, в случае неудачи не просто возвращает код ошибки, но и выводит на экран MessageBox, побороть который мне не удалось. А жаль.

В итоге приемлимое решение видится мне вот как: создаём unmanaged приложение-launcher. В нём проверяем, например, по реестру, наличие нужной нам версии .Net Framework, ну а дальше по обстоятельствам.

Вот такая вот жизненная история.


Comments: Post a Comment



<< Home

This page is powered by Blogger. Isn't yours?