Требуется приложение WinForms для отключения до удаления
-
11-12-2019 - |
Вопрос
Ответ, вероятно, включает в себя пользовательское удаление действий, но кажется таким важным наблюдателем и то, что каждое приложение захочет, поэтому я подумал, что посмотрю, что будет ли что-то легко, мне не хватает.
У меня есть пара проектов, создаваем в Visual Studio 2008, используя проекты C #, WinForm. Один использует клик-один раз установки, и в одном использовании проекта настройки. Они оба позволяют вам покинуть приложение, когда вы удалите. В Windows 7 вы получаете предупреждение, но имейте возможность оставить его в любом случае ... на XP даже не предупреждение.
Позвони мне сумасшедшим, но мысль всех моих программных файлов удалена, и мое приложение все еще осталось работать, не звучит как хороший дизайн вообще. Воспоминания о GPFS приходят на ум, или путь .NET использует задержку задержки для DLL, также может быть проблемой, когда необходимо загрузить DLL, и исчезнет.
Так что есть просто простой способ не разрешить удаление, если ваше приложение все еще работает?
Я использую C #, но я использую класс Single экземпляра VB.NET, чтобы убедиться, что мое приложение работает только один раз, поэтому, возможно, что-то, что использует это, в отличие от создания Mutex для проверки?
Также мое приложение позволяет только «за пользователя» устанавливает, а не «все пользователи», поэтому мне не нужно беспокоиться о моем приложении, запущенном на другом сеансе (если оно есть, это нормально, чтобы оставаться запущенным, потому что это должно быть 100% его собственная копия).
Редактировать: , поскольку я не нахожу ничего другого, я пробовал идею Mutex и не работает. Вот мой код:
В приложении у меня есть это для создания именованного мьютекса и сохраняйте живые во время работы приложения:
.
System.Threading.Mutex m = new System.Threading.Mutex(true, "SafeShare");
SingleInstanceApplication.Run(TabForm, NewInstanceHandler);
GC.KeepAlive(m);
В действии удаления у меня есть это, пока они не выйдут (так как не может быть легко предоставить опцию Отмена):
.
while (true)
{
bool createdNew;
System.Threading.Mutex m = new System.Threading.Mutex(true, "SafeShare", out createdNew);
m.ReleaseMutex();
if (createdNew)
break;
MessageBox.Show(null,"Close XXX and click OK to continue uninstall.","Uninstall");
}
ButeNew никогда не устанавливается в действии удаления, почти как он работает под другим сеансом или что-то в этом роде. Я не пытался добавить глобальную \ на имя мьютекса, но в любом случае, это не будет хорошо работать для моего приложения, потому что я делаю для устанавливаемых для каждого пользователя, поэтому одна установка должна быть в состоянии продолжать работать на другом сеансе, даже если он удалит. < / P >.
Решение
Краткий ответ - это просто простой способ сделать это, потому что это не то, что Microsoft не хочет, чтобы вы сделали.
Мой ответ в конечном итоге, используя Mutex, как только я получил код исправления, кажется, работает нормально.
В приложении я делаю:
System.Threading.Mutex m = new System.Threading.Mutex(true, "MyMutexNameHere");
SingleInstanceApplication.Run(TabForm, NewInstanceHandler);
GC.KeepAlive(m);
.
ОдноinstanceApplication.run Line - это то, что запускает ваше приложение, я использую Framework VB.NET.
в пользовательском удалении действий, которые я делаю:
while (true)
{
bool createdNew;
System.Threading.Mutex m = new System.Threading.Mutex(true, "MyMutexNameHere", out createdNew);
m.Close();
if (createdNew)
break;
MessageBox.Show(null,"Close XXX and click OK to continue uninstall.","Uninstall");
}
.
сначала я использовал m.releaseMutex () вместо m.close (), которую я обнаружил, было выбрасывать исключение, потому что у меня не было мьютекса.Близко было то, что я должен был использовать, просто чтобы убедиться, что моя копия была закрыта, прежде чем я снова проверил (в противном случае CreateNew никогда не был правдой, если это было неправдами впервые).