Значок приложения пуст при запуске с Process.Start

FileInfo fi = new FileInfo(fileToExcecute);
Directory.SetCurrentDirectory(fi.DirectoryName);

ProcessStartInfo pInfo = new ProcessStartInfo();
pInfo.FileName = fileToExcecute;
pInfo.RedirectStandardOutput = false;
pInfo.RedirectStandardError = false;
pInfo.CreateNoWindow = false;
pInfo.UseShellExecute = true;
pInfo.WorkingDirectory = fi.DirectoryName;
if (runas)
    pInfo.Verb = "runas";
pInfo.WindowStyle = ProcessWindowStyle.Normal;

Process p = Process.Start(pInfo);

Значок приложения отсутствует на панели задач. Это просто пустой квадрат!

Вышеприведенный код отлично подходит для нескольких проектов, но не работает с одной конкретной программой - позволяет называть его projectX.exe. Я переписал Main, а также методы запуска projectX.exe, чтобы они имитировали другой проект, который хорошо отображает его значок.

Я пытался в течение нескольких дней выяснить, почему, но провалился. Я пробовал различные идеи, включая изменение значка, изменение его во время выполнения, а также переключение на то, должно ли оно отображаться или нет.

Если мне требуется, чтобы projectX.exe запускался как администратор, значок отображается нормально, но этот параметр недоступен для моих клиентов.

Редактировать 20 окт 2017 Если я изменил имя "projectX.exe" на что-то еще, например, "test.exe", тогда на панели задач появится значок "ОК". Где значки для программы, хранящейся в реестре?

Редактировать 22 октября 2017 года После обновления значков, как было предложено, при запуске программы из Проводника или создании ярлыка значок больше не отображается на панели задач.

Редактировать 12 ноября 2017 года Запустив программу "Как администратор", значок отобразится на панели задач, как ожидалось.

Ответ 1

Если я изменил имя "projectX.exe" на что-то еще... тогда значок отобразит "ОК".

Это определенно проблема, связанная с кэшем значков. Не совсем понятно, почему его сброс не помог решить эту проблему, но похоже, что вы сделали это вручную, и у него есть способы не правильно отображать.

Некоторые предпосылки. Эта проблема довольно распространена на dev-машине, программисты, как правило, заботятся о хроме только после того, как их программа отлаживается и тестируется. Проводник должен увидеть файл program.exe с неправильным значком и скопировать его в кеш. Изменение .exe не заставляет его обновлять кешированную копию, возможно, ошибку. Кэш в остальном очень важен для Проводника, выкапывая значки из файлов в виде папок, полный файлов, может занять несколько секунд на диске шпинделя.

Кэш хранится в файле, а не в реестре. Вы вернетесь в c:\users\yourname\appdata\local\iconcache.db, будьте осторожны, что это скрытый файл. В Windows 8 и выше используется гораздо более удобная схема кэширования с несколькими файлами *.db, хранящимися в каталоге c:\users\yourname\appdata\local\microsoft\windows\explorer.

Удаление этих файлов достаточно, чтобы заставить Explorer заново создать их. Но это не обязательно подходит для вас, вы можете быть на 100% уверены, что Explorer создает новую копию, завершая ее, прежде чем удалять файлы. И другие процессы могут блокировать эти файлы, если у них есть файл кеша, открытый во время выполнения этого, как правило, потому что у них есть расширение оболочки.

Я думаю, что лучший способ к reset кешу - использовать Ramesh Srinivasan cleariconcache.vbs script, доступный из этой веб-страницы, Его код VBScript выглядит убедительно правильным, заботясь обо всех угловых случаях и послушно сообщая о неудаче. Закройте все запущенные программы, чтобы получить максимальные шансы на успех.

Ответ 2

Проблема очень сложна для диагностики без полного понимания вашей среды.

Это звучит так, как будто это может быть проблема операционной системы, а не проблема с вашим кодом.

Один из вариантов может заключаться в том, чтобы программно очистить кэш значков во время перезапуска explorer.exe, следующий код должен сделать это:

foreach (Process exe in Process.GetProcesses())
{
     if (exe.ProcessName.StartsWith("iexplore"))
         exe.Kill();
     }

     // clear icon cache
     strCmdText= "del %userprofile%\appdata\local\iconcache.db /a ";
     Process.Start("CMD.exe",strCmdText);

     Process.Start("explorer.exe");
}

Теперь ваш значок должен быть видимым.