C#应用程序只允许运行一个实例实现方法

方法一:通过Mutex实现

using System;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        //mutex若为内部变量在Release版可能被垃圾回收导致运行一个实例失效
        static Mutex mutex;

        static void Main(string[] args)
        {
            bool IsRunning;
            mutex = new Mutex(true, "MutexName", out IsRunning);

            if (IsRunning)
            {
                Console.WriteLine("程序正常运行!");
            }
            else
            {
                Console.WriteLine("已经运行了一个实例!");
            }

            Console.ReadKey();
        }
    }
}

方法二:通过判断进程名称及程序路径实现

using System;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            if (!RunningInstance())
            {
                Console.WriteLine("程序正常运行!");
                Console.ReadLine();
            }
            else
            {
                Console.WriteLine("已经运行了一个实例!");
                Console.ReadKey();
            }
        }

        /// <summary>
        /// 只运行一个实例
        /// </summary>
        /// <returns></returns>
        public static bool RunningInstance()
        {
            Process current = Process.GetCurrentProcess();
            Process[] processes = Process.GetProcessesByName(current.ProcessName);
            foreach (Process process in processes)
            {
                if (process.Id != current.Id)
                {
                    if (process.MainModule.FileName == current.MainModule.FileName)
                    {
                        return true;
                    }
                }
            }
            return false;
        }
    }
}

说明:方法二可通过修改程序文件名进行破解,相比之下,方法一更好。

参考资料

[1].Mutex实现单实例,你真的搞懂了吗:https://www.cnblogs.com/keyrratuff/archive/2009/04/02/1414249.html

评论: 0 | 引用: 0 | 查看次数: 3854
发表评论
登录后再发表评论!