2010-08-14 3 views
0

У меня есть проект, который показывает интерфейс, когда не передаются правильные аргументы командной строки. Это простая утилита, созданная для динамического обновления обоев рабочего стола. Когда это будет сделано с его обновлением, я вызываюУтилизация приложения .NET перед Application.Run завершена

this.Dispose(); 

но это вызывает проблему, если переданы аргументы командной строки. Форма фактически заканчивает получение вызова метода Dispose до того, как он будет показан пользователю. Результатом является неприятная ошибка, говорящая о том, что программа не запускалась должным образом, даже если она выполнялась именно так, как я хотел.

Я могу уважать то, что я не очень логично отношусь к этому, но у меня нет ни малейшего понятия, как посмотреть на решение. Есть ли другой способ вызвать метод Dispose() до того, как приложение загрузилось без возникновения ошибки?

Дополнительная информация:

Выше доказательно не ясно, и я извиняюсь за это. Моя программа запускается из файла Program.cs:

Application.Run(new MainForm()); 

В конструкторе я проверяю, если аргументы командной строки существует, и если так называют процедуру под названием SilentRun. Этот частный метод проверяет, являются ли аргументы действительными, и если это передаёт их методу для совершения действий, называемых BrandSystem().

После BrandSystem() завершена, с его работой, последнее утверждение

this.Dispose(); 

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

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

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

+0

Очень неясно, ваш фрагмент бесполезен. Зачем распоряжаться чем угодно, когда ваша программа заканчивается? –

+0

@ Hans Passant - см. Обновление для разъяснений. Спасибо, что я слишком расплывчата. – Jeff

+0

Вы только что добавили фрагменты кода, который существует в * любой * программе. –

ответ

1

Я не вижу весь ваш код, но есть ли причина, по которой ваша программа должна звонить Application.Run при работе в бесшумном режиме? Если вы устраните запуск графического интерфейса, вам не придется беспокоиться об утилизации.

Вот как я могу это сделать:

// In main method 

if (runningInSilentMode) 
{ 
    // Run the app in silent mode 
    // Do core behavior based on arguments, don't call Application.Run 
} 
else 
{ 
    // Run the app in interactive mode 
    // Do core behavior based on the user's input 
    Application.Run(new MainForm()); 
} 

Конечно, это предполагает, что ваша логика ядра программа не интегрирована с GUI. Если он интегрирован с вашим графическим интерфейсом, вам нужно будет сделать рефакторинг, чтобы отделить его.

+0

Я думаю, что вы нарушили код здесь! Конечно, ответ заключается в том, чтобы переместить метод SilentInstall() во внешний класс, не содержащийся с графическим интерфейсом, и перенести проверку аргументов командной строки в файл Program.cs. Благодарю. Я знал, что это будет удар по лбу, и, ну, вот, я хлопаю себя в лоб. Благодаря! – Jeff

1

Почему бы не просто пометить его, подождать, пока он загрузится, а затем выйти из приложения? Dispose предназначен для конкретной задачи: Восстановление ресурсов из неуправляемых объектов.

+0

Что вы подразумеваете под флагом? – Jeff

+0

Установите логическое значение, сохраните сеанс. Сделайте что-то, чтобы «сохранить» тот факт, что приложение нужно отключить, затем используйте эту информацию, чтобы решить, следует ли ее закрыть в соответствующее время. – Rushyo

Смежные вопросы