我需要禁止应用程序,如果它从同一个文件夹启动,但如果同一个应用程序从其他文件夹运行则允许它。
问题是当应用程序关闭时它变得不可见但仍然在内存中,因为它终止了一些内部工作。
当旧实例仍然在内存中终止时,用户很可能会从同一文件夹中再次启动此应用程序。
但另一方面,如果此应用程序从其他文件夹运行,则应该可以。
如何在C#中做到这一点?
更新
实际上,应用程序会将一些日志写入子目录中的本地文件,也会写入本地数据库文件。所以很有可能在两个实例之间发生冲突。
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();
}
答案 0 :(得分:2)
谢谢大家!
最后基于这个post我找到了解决方案:
public partial class App : Application
{
private Mutex _instanceMutex = null;
protected override void OnStartup(StartupEventArgs e)
{
string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location).Replace("\\", ".");
// check that there is only one instance of the control panel running...
bool createdNew;
_instanceMutex = new Mutex(true, path, out createdNew);
if (!createdNew)
{
_instanceMutex = null;
MessageBox.Show("Instance already running");
Application.Current.Shutdown();
return;
}
base.OnStartup(e);
}
protected override void OnExit(ExitEventArgs e)
{
if (_instanceMutex != null)
_instanceMutex.ReleaseMutex();
base.OnExit(e);
}
}
答案 1 :(得分:0)
您可以使用锁定文件来指示程序已在该文件夹上运行。
程序启动时,会检查目录中的文件。如果找到它,它会关闭,如果没有,它会创建一个并正常运行。程序完成后,应删除该文件。
这当然不是万无一失的。如果程序崩溃,则不会删除该文件,并且用户可以在程序运行时删除该文件,从而绕过初始检查。