答案可能涉及自定义卸载动作,但似乎如此重大卫生和每个应用程序想要的东西,所以我想我会看到如果有一些容易我缺少的东西。

我有几个项目在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从未如此,如果第一次不是真的)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top