【发布时间】:2012-01-16 18:23:11
【问题描述】:
如果应用程序从同一个文件夹启动,我需要禁止它,但如果同一个应用程序从其他文件夹运行,则允许它。
问题是当应用程序关闭时它变得不可见但仍然在内存中,因为它终止了一些内部工作。
当旧实例仍在内存中终止时,用户很可能会从同一文件夹快速再次启动此应用程序。
但是从另一方面来说,如果这个应用程序从其他文件夹运行应该是可能的。
任何线索如何在 C# 中做到这一点?
更新:
1
实际上,应用程序将一些日志写入子目录中的本地文件以及本地数据库文件中。所以很有可能两个实例之间存在一些冲突。
2
Guid appGuid = Guid.Parse("305BACEA-4074-11E1-85E1-066E4854019B");
public MainWindow()
{
InitializeComponent();
using (Mutex mutex = new Mutex(false, @"Global\" + appGuid) )
{
if (!mutex.WaitOne(0, false))
{
// MessageBox.Show("Instance already running");
// Somehow here I have to get the path of the running instance.
// If the path the same as the current instance has I have do ban starting instance.
return;
}
GC.Collect();
}
【问题讨论】:
-
接近重复一个常见问题。您可以使用基于应用程序路径的命名互斥锁msdn.microsoft.com/en-us/library/system.threading.mutex.aspxstackoverflow.com/questions/819773/…
-
这听起来有点像一个未说出口的问题的笨拙解决方案。如果您解释了为什么两个实例不能从同一个文件夹运行(或从同一个可执行文件启动,通过扩展)的原因,那么也许可以为您提出更好的解决方案。
-
@Lloyd 不清楚如何检测正在运行的应用程序的路径。
-
@Dmitry 您有程序在自己的目录中写入文件吗?不好...
-
@Lloyd - 单实例是一个非常常见的场景。 VS 在应用程序设置中轻松处理单个实例。但是,如果应用程序可以作为多个实例运行,那么这些实例是从单个可执行文件还是从相同的两个副本启动都无关紧要 - 有一个编程解决方案,我敢肯定,它可以更优雅地解决任何这里有冲突。