2012-06-07 24 views
11

Una aplicación ClickOnce creada usando Mage no muestra el ícono que se especificó para el parámetro Mage en el panel de control Agregar o quitar programas.Icono personalizado para la aplicación ClickOnce en 'Agregar o quitar programas'

He leído algunos blogs, como:

¿Cómo puedo lograr esto sin claves del registro de edición? ¿Es posible?

+0

relacionadas: * [Icono de aplicación ClickOnce en 'Añadir o quitar programas'] (http://stackoverflow.com/questions/13265806/) * –

Respuesta

14

No hay forma de hacerlo sin editar el registro, pero puede hacerlo mediante programación. Debe asegurarse de que el icono esté incluido en la implementación. Configuramos la descripción de nuestro ensamblaje en la misma cadena que nuestro Nombre del producto, de modo que podemos buscar a través de las cadenas de desinstalación para la aplicación correcta al buscar la descripción del ensamblaje. De esta forma, no es necesario codificar el nombre del producto en este código.

 private static void SetAddRemoveProgramsIcon() 
    { 
     //only run if deployed 
     if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed 
      && ApplicationDeployment.CurrentDeployment.IsFirstRun) 
     { 
      try 
      { 
       Assembly code = Assembly.GetExecutingAssembly(); 
       AssemblyDescriptionAttribute asdescription = 
        (AssemblyDescriptionAttribute)Attribute.GetCustomAttribute(code, typeof(AssemblyDescriptionAttribute)); 
       string assemblyDescription = asdescription.Description; 

       //the icon is included in this program 
       string iconSourcePath = Path.Combine(System.Windows.Forms.Application.StartupPath, "youriconfile.ico"); 

       if (!File.Exists(iconSourcePath)) 
        return; 

       RegistryKey myUninstallKey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Uninstall"); 
       string[] mySubKeyNames = myUninstallKey.GetSubKeyNames(); 
       for (int i = 0; i < mySubKeyNames.Length; i++) 
       { 
        RegistryKey myKey = myUninstallKey.OpenSubKey(mySubKeyNames[i], true); 
        object myValue = myKey.GetValue("DisplayName"); 
        if (myValue != null && myValue.ToString() == assemblyDescription) 
        { 
         myKey.SetValue("DisplayIcon", iconSourcePath); 
         break; 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       //log an error 
      } 
     } 
    } 
+0

lugar en el que se ejecuta esto desde? – HackSlash

Cuestiones relacionadas