1

答案可能涉及自定义卸载操作,但它似乎是一个主要的过度站点,并且是每个应用程序都想要的东西,所以我想我会看看是否有一些容易我遗漏的东西。

我有几个使用 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\ 添加到互斥锁名称中,但这对我的应用程序来说无论如何都不起作用,因为我会按用户进行安装,因此即使卸载了一个安装,一个安装也应该能够在另一个会话上继续运行。

4

1 回答 1

0

简短的回答是没有简单的方法可以做到这一点,因为这不是微软希望你做的事情。

我的答案确实最终使用了互斥锁,一旦我得到正确的代码,它似乎工作正常。

在我做的应用程序中:

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() ,我发现它引发了异常,因为我不拥有互斥锁。Close 是我应该使用的,只是为了确保我的副本在我再次检查之前已关闭(否则 createNew 永远不会是真的,如果它第一次不是真的)。

于 2012-05-22T22:00:07.530 回答