在卸载之前要求Winforms应用程序关闭
-
11-12-2019 - |
题
答案可能涉及自定义卸载动作,但似乎如此重大卫生和每个应用程序想要的东西,所以我想我会看到如果有一些容易我缺少的东西。
我有几个项目在Visual Studio 2008中使用C#,WinForm项目创建。一个使用点击安装,一个使用一个使用设置项目。它们都允许您在卸载时留下应用程序运行。在Windows 7上,您确实收到警告,但可以选择使其运行无论如何......在XP上甚至没有警告。
打电话给我疯了,但想到了我的所有程序文件被删除,我的应用程序仍然离开运行,听起来根本不像是一个很好的设计。 GPF的回忆来到思想,或者.NET使用延迟加载的方式,当需要加载DLL时也可能是一个问题,并且已经消失。
所以如果您的应用程序仍在运行,则有一种简单的方法,不允许卸载?
我正在使用c#,但我正在使用vb.net单实例类来确保我的应用程序只运行一次,所以可能有利于创建互斥锁的东西来检查?
也是我的应用程序只允许“每个用户”安装,而不是“所有用户”,所以我不必担心我的应用程序在另一个会话中运行(如果是,则可以留下来运行,因为它应该是100%自己的副本)。
编辑:因为我找不到别的东西,我已经尝试了互斥锁的想法,它不起作用。这是我的代码:
在应用程序中,我有这个可以创建命名互斥锁并在应用程序运行时保持活动:
.
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");
}
创建了new永远不会在卸载操作中设置,几乎就像它在不同的会话或其他东西下运行。我没有尝试向互斥锁名添加全局\,但是对于我的应用程序不适用于我的应用程序,因为我做的每个用户安装,所以即使卸载一个也应该能够在另一个会话上继续运行。< / p>
解决方案
简短的答案是没有简单的方法,因为它不是微软想要你做的事情。
我的答案结束了使用互斥锁,一旦我得到了正确的代码,它似乎工作正常。
在应用程序中我这样做:
System.Threading.Mutex m = new System.Threading.Mutex(true, "MyMutexNameHere");
SingleInstanceApplication.Run(TabForm, NewInstanceHandler);
GC.KeepAlive(m);
.
singleinstanceapplication.run线是运行应用程序的原因,我正在使用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从未如此,如果第一次不是真的)。