приложение не запускается при запуске после добавления значка уведомления

мое приложение работало нормально, и раньше оно запускалось при запуске. Я добавил значок уведомления, и в моем коде есть места, где этот значок меняется. Я добавил все необходимые значки в корневую папку своего приложения, и все работает нормально со значками, кроме начальной загрузки моего приложения. Я вижу адрес моего приложения в «запущенной» части реестра (я имею в виду, что все то же самое, что и при правильной загрузке моего приложения при запуске), но мое приложение больше не будет запускаться при запуске. какие советы по моему вопросу? PS: я подумал, что должен немного объяснить свою работу, и я написал небольшую часть приложения с точно такой же проблемой.

    public Icon[] icons = new Icon[2] { new Icon("icon1.ico"), new Icon("icon2.ico") };
    public int counter = 0;


    private void button1_Click(object sender, EventArgs e)
    {
        notifyIcon1.Visible = true;
        timer1.Start();

    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        counter %= 2;
        notifyIcon1.Icon = icons[counter];
        counter++;

Как видите, приложение меняет значок уведомления при каждом тике. С этим кодом приложение не будет запускаться при запуске. Но если я удалю функцию смены значков приложения, оно действительно запустится при запуске.


person roostaamir    schedule 28.02.2013    source источник


Ответы (1)


Это требует психической отладки, я предполагаю, что вы загружаете эти значки, используя их относительное имя пути. Что-то вроде новой иконки ("foo.ico").

Это может работать правильно только в том случае, если рабочий каталог вашей программы по умолчанию установлен там, где вы надеетесь. Обычно это так, особенно когда вы запускаете свою программу из Visual Studio или запускаете ее с ярлыка на рабочем столе. Но нет, когда вы добавили его в раздел реестра Run. Environment.CurrentDirectory будет установлен в другом месте, обычно в каталоге Windows.

Вы должны всегда использовать полные пути к файлам. Простой способ получить этот путь:

    var home = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
    var path = System.IO.Path.Combine(home, "foo.ico");
    var icon = new Icon(path);

Но, безусловно, есть лучший способ, чем хранить значки в виде файлов, вы можете встроить их в свою программу. Проект + Свойства, вкладка Ресурсы. Нажмите стрелку на кнопке «Добавить ресурс», «Добавить существующий файл» и перейдите к файлу .ico. Теперь значок встроен в вашу программу, вы никогда не потеряете его и не забудете скопировать при развертывании программы на другом компьютере. И код проще:

    var icon = Properties.Resources.foo;
person Hans Passant    schedule 28.02.2013
comment
Хорошо, моя догадка была верной. Пожалуйста, всегда добавляйте фрагмент кода, чтобы нам не приходилось делать подобные предположения и не менять ответ после того, как вы изменили вопрос. - person Hans Passant; 28.02.2013
comment
большое спасибо. и извините, если я опоздал с образцом кода. это интересно, что рабочий каталог по умолчанию не всегда является папкой, в которой существует мое приложение. не могли бы вы объяснить больше об этой теме (или, возможно, дайте мне ссылку на где-нибудь я можете прочитать об этом). потому что я не совсем понял, ПОЧЕМУ это происходит. но еще раз спасибо за ваше решение. - person roostaamir; 28.02.2013
comment
Я почти уверен, что это нигде не задокументировано. Рабочий каталог процесса ожидается в произвольном месте. Вот почему существует свойство ProcessStartInfo.WorkingDirectory. И вы можете изменить его в ярлыке на рабочем столе. Он случайно совпадает с каталогом EXE. Обычная авария однако. - person Hans Passant; 01.03.2013