6

「プログラムの追加と削除」の「ClickOnce アプリケーションのカスタム アイコン」のスタック オーバーフローの質問と「プログラムの追加と削除」で ClickOnce アプリケーションのアイコンを変更する方法はありますか? で解決策を試しました.

だから、ここに私の実装があります。どちらもコンパイルされ、コードの実行時に例外はスローされません。ClickOnce セットアップ ファイルを Web サーバーに公開し、コンピューターからアンインストールした後にインストールしています。コントロール パネルの [プログラムの追加と削除] に移動すると、プログラムの汎用アイコンがまだ表示されます。他のどこでも問題はなく、アイコンは問題なく表示されます。

/*  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());
        }
    }
}
*/
4

4 に答える 4

5

レジストリを見て、他のアプリケーションの設定をコピーした後、ようやくそれを理解しました。ClickOnce でデプロイされたアプリケーションで EXE ファイルを参照できないのは奇妙です。少なくとも私はそれを機能させることができませんでした。.icoそのため、代わりに を参照することに戻りました。コメントを必ず読んでください!

using System.Deployment.Application;
using Microsoft.Win32;
//Call this method as soon as possible

private static void SetAddRemoveProgramsIcon()
{
    //Only execute on a first run after first install or after update
    if (ApplicationDeployment.CurrentDeployment.IsFirstRun)
    {
        try
        {
            // Set the name of the application EXE file - make sure to include `,0` at the end.
            // Does not work for ClickOnce applications as far as I could figure out... Note, this will probably work
            // when run from Visual Studio, but not when deployed.
            //string iconSourcePath = Path.Combine(System.Windows.Forms.Application.StartupPath, "example.exe,0");
            // Reverted to using this instead (note this will probably not work when run from Visual Studio, but will work on deploy.
            string iconSourcePath = Path.Combine(System.Windows.Forms.Application.StartupPath, "example.ico");
            if (!File.Exists(iconSourcePath))
            {
                MessageBox.Show("We could not find the application icon. Please notify your software vendor of this error.");
                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");
                Console.WriteLine(myValue.ToString());
                // Set this to the display name of the application. If you are not sure, browse to the registry directory and check.
                if (myValue != null && myValue.ToString() == "Example Application")
                {
                    myKey.SetValue("DisplayIcon", iconSourcePath);
                    break;
                }
            }
        }
        catch(Exception mye)
        {
            MessageBox.Show("We could not properly setup the application icons. Please notify your software vendor of this error.\r\n" + mye.ToString());
        }
    }
}
于 2013-05-01T15:52:26.940 に答える
0

次のコードで簡単に実行できます。

string Install_Reg_Loc = @"Software\Microsoft\Windows\CurrentVersion\Uninstall";

string displayIcon = @"C:\MorganTech\setup-icon.ico";

RegistryKey hKey = (Registry.LocalMachine).OpenSubKey(Install_Reg_Loc, true);

RegistryKey appKey = hKey.OpenSubKey(productName);

appKey.SetValue("DisplayIcon", (object)displayicon, RegistryValueKind.String)
于 2013-09-06T04:27:03.217 に答える