2010-02-03 7 views
5

Ho diverse app su cui lavoro e mi piace distribuire agli amici che richiedono i dll e i framework forniti da Microsoft. In particolare, XNA. Sono stanco di ricevere e-mail da loro dicendo "Si è schiantato" quando in realtà, tutto ciò che è successo è che non hanno XNA (o .NET 3.5, o qualsiasi altra cosa) installato. Tuttavia, Main non riesce a rilevare questi errori perché .exe li carica prima che anche main venga eseguito.Controllo delle dipendenze .NET prima dell'avvio di

Quindi, la mia domanda è, come potrei fare per creare un launcher in grado di controllare cose come .NET 3.5, XNA, ecc. E visualizzare un messaggio di errore piacevole ("Questa applicazione richiede XNA 3.0, scaricala qui! ") invece di sembrare come si è schiantato?

AGGIORNAMENTO: avrei dovuto specificare che voglio farlo senza usare un programma di installazione. Ho un programma di installazione WIX per la piastra di riscaldamento che mi permette di verificare le dipendenze, ma a volte voglio solo caricare una zip per far giocare le persone.

risposta

7

Per eseguire questa operazione senza un programma di installazione, è possibile creare uno script di "avvio" che non faccia altro che chiamare il punto di ingresso "reale" dopo aver eseguito i controlli di dipendenza in primo piano.

Dal momento che le dipendenze mancanti sembrano essere una fonte molto comune di dolore per te, è probabilmente consigliabile scrivere il programma di avvio in qualcosa che va fuori dal suo modo di non avere dipendenze che non siano già su una semplice installazione di Windows, come come AutoIt script impacchettato come un eseguibile.

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

Sembra una buona alternativa. Puoi darmi un esempio di uno script AutoIt che verrebbe controllato, per esempio, su .NET 3.5? – Jeff

1

È possibile creare un progetto di installazione (che viene compilato su un programma di installazione MSI) per l'applicazione. Nella configurazione di questo programma di installazione, è possibile impostare i prerequisiti come .NET Framework vX.X. Non sono assolutamente sicuro di XNA, ma suppongo che questo possa essere elencato come un prerequisito.

+1

Cosa succede se disinstallano il framework in un secondo momento, ma l'app è ancora installata? Per quanto ne so, il programma di disinstallazione di .NET non controlla se ci sono app che dipendono da esso. – Nathan

+0

@Nathan: cosa succederebbe alle app sul tuo computer se hai disinstallato il framework .NET in questo momento? Sulla mia macchina molte cose si rompono probabilmente. Non penso che sia qualcosa con cui la tua app dovrebbe avere a che fare. –

+0

@Andy: Mi piacerebbe che le app non avessero a che fare con esso. Tuttavia, la domanda qui riguarda esattamente questo tipo di problema (che ho anche sperimentato). Non è poi così insolito per gli utenti disinstallare una versione precedente del framework dopo averne installato uno nuovo. Per lo meno, sarebbe utile avere una diagnostica nel programma per verificare quali versioni sono disponibili quando si verifica un errore. – Nathan

2

Questa operazione viene eseguita più facilmente durante l'installazione. Includere lo Microsoft XNA Framework Redistributable con il pacchetto di installazione.

È possibile utilizzare MsiQueryProductState function per determinare se il framework è già installato.

Oppure si potrebbe controllare il registro per:

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

(. Questo controllo potrebbe in alternativa essere eseguita in un'applicazione di avvio)

Here's an article about distributing your game con una sezione sulla rilevazione e l'installazione di prerequisiti.