答案可能涉及自定义卸载操作,但它似乎是一个主要的过度站点,并且是每个应用程序都想要的东西,所以我想我会看看是否有一些容易我遗漏的东西。
我有几个使用 C#、Winform 项目在 Visual Studio 2008 中创建的项目。一种使用单击一次安装,一种使用安装项目。它们都允许您在卸载时保持应用程序运行。在 Windows 7 上,您确实会收到警告,但可以选择让它继续运行……在 XP 上甚至没有警告。
说我疯了,但是想到我的所有程序文件都被删除了,我的应用程序仍在运行,这听起来根本不是一个好的设计。想起 GPF 的记忆,或者 .NET 对 DLL 使用延迟加载的方式,在需要加载 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");
}
createdNew 从未在卸载操作中设置,几乎就像它在不同的会话或其他东西下运行一样。我没有尝试将 Global\ 添加到互斥锁名称中,但这对我的应用程序来说无论如何都不起作用,因为我会按用户进行安装,因此即使卸载了一个安装,一个安装也应该能够在另一个会话上继续运行。