Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > корректное завершение приложения


Автор: blackbanny 17.6.2013, 19:16
Доброго времени суток!
Я создаю dll своего проекта на C#
Эту dll добавляю в зависимости другого приложения и запускаю свое приложение(dll), но после закрытия dll, закрывается и приложение которое ее использует
В моем приложении есть класс, который создает форму: 
Код

Application.Run(new Form1());

в классе Form1 есть кнопка "Cancel", при нажатииa на которую я хочу закрыть свое приложение(dll), в Click на Cancel я пишу: 
Код

Application.Exit() или Environment.Exit(0);

Без разницы, как закрывать приложение, вызывающее приложение закрывается вместе с моим...
Подскажите, как закрыть только мое приложение? 
Код

this.Close() 
у Form1 не предлагать, тоже не работает...
Как узнать название процесса моей программы, чтобы я сделал Kill()?

Автор: Fobos 17.6.2013, 20:30
Приложение это все же процесс. А библиотеки уже загружаются в процесс. Сл-но не вы управляете приложением и не вы должны его закрывать, ваша библиотека всего лишь должна предлагать какую-то функциональность для ее клиентов. Если вы используете какие-то ресурсы которые надо освободить, можете реализовать паттерн IDisposable в вашем Form1. Еще раз, вас вызвали - пусть они и думают, вы должны лишь выполнять ту работу для которой вы написали библиотеку, остально дела корабельной артиллерии.

Автор: blackbanny 18.6.2013, 06:14
Fobos, спасибо за ответ)
сейчас опишу подробнее и ситуацию, когда я не пишу в своем приложении 
Код

Application.Exit()

в моем приложении(dll) есть класс Program, который создает Form1 в методе 
Код

public void Main
:
Код

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());

в стороннем приложении после подключения dll, я вызываю свое приложение таким образом:
Код

FlexiCapture_Blank_Page_Removal_Dialog.Program BlankPageRemoval = new FlexiCapture_Blank_Page_Removal_Dialog.Program();
BlankPageRemoval.Main();

первый раз в стороннем приложении моя программа вызывается корректно, а вот после второго вызова выпадает exception:
http://s2.ipicture.ru/uploads/20130618/88cUs15h.jpg
если я комментирую строку в Program: 
Код

Application.SetCompatibleTextRenderingDefault(false);

или ставлю true 
Код

Application.SetCompatibleTextRenderingDefault(true);

то происходит тоже самое... :(

Автор: Fynivx 19.6.2013, 04:15
Если я правильно понял, Вы в библиотеке пытаетесь сделать полноценное WinForms-приложение.
Есть в .NET способы изоляции, но сейчас у Вас ошибка не в их незнании, а в неудачной архитектуре.

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

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com//object-id51bf36bf6ccc193133000002#findElement_E7045_51c106266ccc1933230002a7_0

Автор: blackbanny 19.6.2013, 05:23
проблему решил сделав singleton, т.е. в своем приложении класс с формой имеет instance конструктор и статический экземпляр класса, при каждом закрытии формы статический экземпляр класса уничтожал...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)