2010-02-03 13 views
5

Mam kilka aplikacji, nad którymi pracuję i które lubię rozpowszechniać wśród znajomych, którzy wymagają dostarczonych przez Microsoft .dll i lub frameworków. W szczególności XNA. Jestem zmęczony otrzymywaniem od nich wiadomości e-mail z informacją "Rozbił się", gdy w rzeczywistości wszystko, co się wydarzyło, to to, że nie ma zainstalowanego XNA (lub .NET 3.5, lub czegoś podobnego). Jednak główny nie może złapać tych błędów, ponieważ .exe ładuje je, zanim główny jest nawet wykonywany.Sprawdzanie zależności .NET przed uruchomieniem

Moje pytanie brzmi: w jaki sposób utworzyć program uruchamiający, który mógłby sprawdzić takie rzeczy jak .NET 3.5, XNA itd. I wyświetlić miły komunikat o błędzie ("Ta aplikacja wymaga XNA 3.0, pobierz ją tutaj! ") zamiast wyglądać jak rozbił się?

AKTUALIZACJA: Powinienem był określić, że chcę to zrobić bez użycia instalatora. Mam instalator WIX instalujący płytę grzewczą, który pozwala mi sprawdzić zależności, ale czasami chcę tylko przesłać zip, aby ludzie mogli się bawić.

Odpowiedz

7

Aby to zrobić bez instalatora, możesz chcieć utworzyć skrypt "launcher", który wykonuje niewiele więcej niż wywołanie "prawdziwego" punktu wejścia po uprzednim sprawdzeniu zależności.

Ponieważ brakujące zależności wydają się być bardzo częstym źródłem bólu dla ciebie, prawdopodobnie zalecane jest napisanie programu uruchamiającego w sposób, który nie ma żadnych zależności, które nie są już na czystej instalacji systemu Windows, takich jak jako AutoIt script zapakowany jako plik wykonywalny.

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

Wygląda na dobrą alternatywę. Czy możesz podać przykład skryptu AutoIt, który sprawdzi, powiedzmy, .NET 3.5? – Jeff

1

Można utworzyć projekt instalacji (który będzie kompilowany do instalatora MSI) dla aplikacji. W konfiguracji tego instalatora można ustawić wymagania wstępne, takie jak .NET Framework vX.X. Nie mam absolutnej pewności co do XNA, ale zakładam, że to również może być wymienione jako warunek wstępny.

+1

Co się stanie, jeśli odinstalują framework później, ale Twoja aplikacja będzie nadal zainstalowana? O ile mi wiadomo, deinstalator szkieletu .NET nie sprawdza, czy istnieją aplikacje, które od niego zależą. – Nathan

+0

@Nathan: Co stanie się z aplikacjami na twoim komputerze, jeśli odinstalowałeś teraz framework .NET? Na mojej maszynie wiele rzeczy prawdopodobnie pękłoby. Nie sądzę, że jest to coś, z czym powinna poradzić sobie twoja aplikacja. –

+0

@Andy: Szkoda, że ​​aplikacje nie miały z tym nic wspólnego. Jednak tutaj pytanie dotyczy właśnie tego rodzaju problemu (którego również doświadczyłem). Nie jest niczym nadzwyczajnym odinstalowanie starszej wersji frameworku po zainstalowaniu nowego. Przynajmniej warto mieć w swoim programie diagnostycznym, aby sprawdzić, które wersje są dostępne, gdy wystąpi błąd. – Nathan

2

Dokonuje się tego najłatwiej podczas instalacji. Dołącz pakiet Microsoft XNA Framework Redistributable do swojego pakietu instalacyjnego.

Możesz użyć MsiQueryProductState function, aby ustalić, czy framework jest już zainstalowany.

Albo można sprawdzić w rejestrze:

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

(. Kontrola ta może być alternatywnie wykonywane w aplikacji launcher)

Here's an article about distributing your game z sekcji na wykrywanie i instalowanie warunki.

Powiązane problemy