2010-02-03 15 views
5

Tengo varias aplicaciones en las que trabajo y me gusta distribuirlas a amigos que requieren Microsoft .Dlls y/o frameworks. Específicamente, XNA. Estoy cansado de recibir correos electrónicos de ellos que dicen "Se estrelló" cuando, en realidad, todo lo que sucedió es que no tienen instalado XNA (o .NET 3.5, o lo que sea). Sin embargo, Main no puede detectar estos errores porque el .exe los carga antes de que se ejecute main.Comprobación de las dependencias de .NET antes de iniciar

Entonces, mi pregunta es, ¿cómo podría crear un iniciador que pudiera verificar cosas como .NET 3.5, XNA, etc. y mostrar un buen mensaje de error ("Esta aplicación requiere XNA 3.0, descárgala aquí! ") en lugar de parecer que se estrelló?

ACTUALIZACIÓN: Debería haber especificado que quiero hacer esto sin usar un instalador. Tengo un instalador WIXI de placas de calderas que me permite verificar las dependencias, pero a veces solo quiero cargar un archivo comprimido para que las personas jueguen con él.

Respuesta

7

Para hacer esto sin un instalador, es posible que desee crear un script "iniciador" que haga poco más que llamar al punto de entrada "real" después de realizar cualquier comprobación de dependencia desde el principio.

Dado que las dependencias faltantes parecen ser una fuente de dolor muy común para usted, probablemente sea aconsejable escribir el iniciador en algo que se salga de su camino para no tener dependencias que no estén ya en una instalación de Windows, como como un AutoIt script empaquetado como un ejecutable.

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

Parece una buena alternativa. ¿Puede darme un ejemplo de un script de AutoIt que verifique, digamos, .NET 3.5? – Jeff

1

Puede crear un proyecto de instalación (que se compila en un instalador MSI) para su aplicación. En la configuración de este instalador, puede establecer requisitos previos como .NET Framework vX.X. No estoy absolutamente seguro acerca de XNA, pero supongo que esto también se puede enumerar como un requisito previo.

+1

¿Qué sucede si desinstalan el marco más adelante, pero su aplicación todavía está instalada? Hasta donde yo sé, el desinstalador de .NET Framework no verifica si hay aplicaciones que dependen de él. – Nathan

+0

@Nathan: ¿Qué pasaría con las aplicaciones en su máquina si desinstaló el marco .NET ahora mismo? En mi máquina, MUCHAS cosas probablemente se romperían. No creo que sea algo con lo que tu aplicación deba lidiar. –

+0

@Andy: Desearía que las aplicaciones no tuvieran que lidiar con eso. Sin embargo, la pregunta aquí es tratar exactamente con este tipo de problema (que también he experimentado). No es extraño que las personas desinstalen una versión anterior del framework después de que se haya instalado uno nuevo. Por lo menos, sería útil tener un diagnóstico en su programa para verificar qué versiones están disponibles cuando ocurre un error. – Nathan

2

Esto se hace más fácilmente durante la instalación. Incluya el Microsoft XNA Framework Redistributable con su paquete de instalación.

Puede usar el MsiQueryProductState function para determinar si el marco ya está instalado.

O se puede comprobar el registro para:

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

(. Esta comprobación, alternativamente, podría llevarse a cabo en un lanzador de aplicaciones)

Here's an article about distributing your game con una sección sobre la detección e instalación de requisitos previos.

Cuestiones relacionadas