2012-08-05 12 views
13

Estoy trabajando en una aplicación de consola de Windows C# que deseo permitir al usuario instalar en su computadora.Programando programáticamente el programa en Agregar/Quitar programas y almacenando archivos dentro de un archivo ejecutable

Quiero hacer mi propio ejecutable de Windows Installer ya que las herramientas de Implementación de instalación integradas en Visual Studio parecen carecer de funcionalidad para personalizaciones y documentación.

Por lo tanto, como deseo crear mi propio instalador de Windows, ¿cómo puedo registrar mi programa en la ventana Agregar o quitar programas para que puedan elegir desinstalarlo nuevamente si lo desean y relanza mi programa de instalación para eliminarlo? . También, obviamente, el ejecutable necesitaría copiar los archivos en varias ubicaciones de la PC, es decir, C:\Program Files, así que, ¿cómo almacenaría los archivos ejecutables dentro del instalador de Windows para poder moverlos a la ubicación correcta?

¿Es esto posible?

Gracias por cualquier ayuda que pueda proporcionar.

+0

¿Has probado las opciones de implementación de ClickOnce? –

+0

¿Por qué reinventar la rueda? Si no te gusta la herramienta de Windows incluida, iría directamente a NSIS: http://nsis.sourceforge.net/Main_Page. – Mark

+0

¿Qué hay de usar WiX? – siride

Respuesta

23

Aquí es una rutina que utilizamos para registrar nuestro programa en Agregar/quitar programas:

private void CreateUninstaller() 
{ 
    using (RegistryKey parent = Registry.LocalMachine.OpenSubKey(
       @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", true)) 
    { 
     if (parent == null) 
     { 
      throw new Exception("Uninstall registry key not found."); 
     } 
     try 
     { 
      RegistryKey key = null; 

      try 
      { 
       string guidText = UninstallGuid.ToString("B"); 
       key = parent.OpenSubKey(guidText, true) ?? 
         parent.CreateSubKey(guidText); 

       if (key == null) 
       { 
        throw new Exception(String.Format("Unable to create uninstaller '{0}\\{1}'", UninstallRegKeyPath, guidText)); 
       } 

       Assembly asm = GetType().Assembly; 
       Version v = asm.GetName().Version; 
       string exe = "\"" + asm.CodeBase.Substring(8).Replace("/", "\\\\") + "\""; 

       key.SetValue("DisplayName", "My Program"); 
       key.SetValue("ApplicationVersion", v.ToString()); 
       key.SetValue("Publisher", "My Company"); 
       key.SetValue("DisplayIcon", exe); 
       key.SetValue("DisplayVersion", v.ToString(2)); 
       key.SetValue("URLInfoAbout", "http://www.blinemedical.com"); 
       key.SetValue("Contact", "[email protected]"); 
       key.SetValue("InstallDate", DateTime.Now.ToString("yyyyMMdd")); 
       key.SetValue("UninstallString", exe + " /uninstallprompt"); 
      } 
      finally 
      { 
       if (key != null) 
       { 
        key.Close(); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(
       "An error occurred writing uninstall information to the registry. The service is fully installed but can only be uninstalled manually through the command line.", 
       ex); 
     } 
    } 
} 
+0

¿Qué es la "B"? – MacGyver

+1

@MacGyver, 'B' significa" 32 dígitos separados por guiones, encerrados entre llaves ", que es el formato que usa el registro para las guías. https://msdn.microsoft.com/en-us/library/97af8hh4(v=vs.110).aspx –

+2

Parece que "UninstallGuid" y "UninstallRegKeyPath" no están definidos en su código fuente. Supongo que el segundo es la ruta del exe para desinstalar la aplicación. ¿Puedes comentar sobre estos dos por favor? También puedo publicar una pregunta para deshacer esta tecla de registro, pero esa fue mi tercera y última pregunta. – MacGyver

2

No construya su propio instalador, use una herramienta de despliegue comprobada como: NSIS, Inno Setup o WiX. Todos los cuales son gratuitos y tienen muchas funciones.

+4

no olvide que tienen sus propios contras como curva de aprendizaje, otro lenguaje de programación, más archivos para manejar, bitness (no AnyCPU), localización – Firo

+0

No lo olvido. Pero dé crédito a los que construyen estos sistemas bastante complejos que resolvieron tantos problemas que no tendrá tiempo de hacer por su cuenta, incluso si le ahorra aprender un nuevo idioma. Como nota al margen: no hay ningún problema con la bitness o la localización y no terminará con más archivos para manejar. – Eden

+0

Añadir bitrock también. Lo usé una vez. Fue fácil de usar. Pero no es de código abierto. – prabhakaran

0

Recomendaría usar el instalador MSI en este caso, ya que le permitirá controlar los detalles del paquete (es decir, nombre), dónde copiar los archivos en el cliente y permite agregar archivos adicionales que desea incluir como parte de msi instalador.

0

Por el amor de dios, no use ClickOnce ... es más una molestia que vale la pena. Si no tiene derechos administrativos para una máquina y necesita instalar algo, vale la pena pedir permiso.

Cuestiones relacionadas