2010-02-03 3 views
5

У меня есть несколько приложений, над которыми я работаю, и хотел распространять их друзьям, которым требуются Microsoft .dll и/или фреймворки. В частности, XNA. Я устал от получения от них электронных писем, говоря: «Он разбился», когда на самом деле все произошло, так как они не имеют установленной XNA (или .NET 3.5 или что-то еще). Тем не менее, Main не может поймать эти ошибки, потому что .exe загружает их до того, как main даже выполнен.Проверка на наличие зависимостей .NET перед запуском

Итак, мой вопрос в том, как мне приступить к созданию пусковой установки, которая могла бы проверять такие вещи, как .NET 3.5, XNA и т. Д., И отображать приятное сообщение об ошибке («Это приложение требует XNA 3.0, загрузите его здесь! ") вместо того, чтобы выглядеть так, как он разбился?

UPDATE: Я должен был указать, что хочу сделать это, не используя установщик. У меня есть установщик WIX для плиты котла, который позволяет мне проверять зависимости, но иногда я просто хочу загрузить почтовый индекс для людей, с которыми можно поиграть.

ответ

7

Для этого без установщика вам может понадобиться создать сценарий «запуска», который делает не что иное, как вызов «реальной» точки входа после выполнения любых проверок зависимостей впереди.

Поскольку отсутствующие зависимости, по-видимому, являются очень распространенным источником боли для вас, вероятно, желательно написать пусковую установку в чем-то, что выходит за ее пределы, чтобы не иметь зависимостей, которые еще не установлены на голых установках Windows, таких как как AutoIt script, упакован как исполняемый файл.

Const $AppTitle = 'Whizzy Game' 
Const $MB_ICONERROR = 16 

If RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5', 'Install') <> 1 Then 
    MsgBox($MB_ICONERROR, $AppTitle, 'The .NET Framework runtime v3.5 is required to run.') 
    Exit 1 
EndIf 

If RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\XNA\Framework\v3.1', 'Installed') <> 1 Then 
    MsgBox($MB_ICONERROR, $AppTitle, 'The XNA Framework runtime v3.1 is required to run.') 
    Exit 1 
EndIf 

Exit RunWait('WhizzySoftware.WhizzyGame.EntryPoint.exe') 
+0

Похож на хорошую альтернативу. Можете ли вы привести пример сценария AutoIt, который будет проверять, скажем, .NET 3.5? – Jeff

1

Вы можете создать проект установки (который компилируется установщиком MSI) для вашего приложения. В конфигурации этого установщика вы можете установить такие предварительные условия, как .NET Framework vX.X. Я не совсем уверен в XNA, но я бы предположил, что это может быть указано как необходимое условие.

+1

Что делать, если они удаляют фреймворк позже, но ваше приложение все еще установлено? Насколько я знаю, деинсталлятор .NET framework не проверяет, есть ли приложения, зависящие от него. – Nathan

+0

@Nathan: Что произойдет с приложениями на вашем компьютере, если вы удалили платформу .NET прямо сейчас? На моей машине много вещей, возможно, сломается. Я не думаю, что вам нужно иметь дело с вашим приложением. –

+0

@ Энди: Мне жаль, что приложениям не пришлось иметь дело с этим. Однако здесь речь идет именно о таком типе проблемы (который я также испытал). Не все так необычно для людей, чтобы удалить старую версию фреймворка после того, как новый был установлен. По крайней мере, было бы полезно иметь диагностику в вашей программе, чтобы проверить, какие версии доступны при возникновении ошибки. – Nathan

2

Это делается наиболее легко во время установки. Включите Microsoft XNA Framework Redistributable с установочным пакетом.

Вы можете использовать MsiQueryProductState function, чтобы определить, установлена ​​ли инфраструктура.

Или вы могли бы проверить реестр для:

[HKEY_LOCAL_MACHINE\Software\Microsoft\XNA\Framework\v3.1] 
Installed=1 

(. Эта проверка может быть альтернативно выполнена в приложении пускового)

Here's an article about distributing your game с секцией по обнаружению и установки необходимых компонентов.

Смежные вопросы