ho cercato la soluzione in Stack Overflow domande Custom icon for ClickOnce application in 'Add or Remove Programs' e Is there a way to change the icon of a ClickOnce application in 'Add or Remove Programs'?.'Installazione applicazioni' icona di un C# un'applicazione ClickOnce
Quindi, ecco le mie implementazioni. Entrambi vengono compilati e non vengono generate eccezioni quando viene eseguito il codice. Sto pubblicando i file di installazione di ClickOnce su un server web e quindi installandolo dopo la disinstallazione dal computer. Quando vado al pannello di controllo Aggiungi o rimuovi programmi, vedo ancora l'icona generica per il mio programma. Ovunque non ho problemi e la mia icona si presenta bene.
/* METHOD ONE */
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, "forico4.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() == "admin")
{
myKey.SetValue("DisplayIcon", iconSourcePath);
break;
}
}
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message.ToString());
}
}
}
*/
/* METHOD TWO */
private static void SetAddRemoveProgramsIcon()
{
//only run if deployed
if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed
&& ApplicationDeployment.CurrentDeployment.IsFirstRun)
{
try
{
string iconSourcePath = Path.Combine(System.Windows.Forms.Application.StartupPath, "forico4.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() == "GoldMailAkamai")
{
myKey.SetValue("DisplayIcon", iconSourcePath);
break;
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
*/
Perché non possiamo farlo senza l'hacking del registro? – HackSlash