兔八哥极品软件园    运行: 4493天 | 文章:640 篇 | 评论:505 条 | 碎语:1条

C#让程序只运行一个实例

作者:admin 发布于:2012-3-12 19:13 Monday 分类:.NET


通常我们会遇到这样的情况,让程序只运行一个实例,

比如启动杀毒软件时,只能启动一个,再启动的话就没什么效果!

利用程序名来判断不是一个好办法,如果我 们把程序名称改一下就可以运行两个完全一样的进程。

我们最好利用程序集的Attribute存放特定信息,然后用Assembly对象的 GetCustomAttributes()方法获取该信息进行判断。

方法一

把AssemblyInfo.cs里的[assembly: AssemblyFileVersion("1.0.0.0")]改[assembly:AssemblyFileVersion("2.0.0.8")],然后利用该信息进行判断。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Reflection;
using System.Collections;
using System.Threading;

namespace MyWork_01
{
    class Program
    {
        static void Main(string[] args)
        {
            Process[] processes = Process.GetProcesses();         //获得当前所有进程
            Process currentProcess = Process.GetCurrentProcess(); //获取当前正在运行进程
            ProcessModule currentPM = currentProcess.Modules[0];

            int same = 0;                                         //相同运行实例个数

            ArrayList proList = new ArrayList();                  //将相同实例加入此集合中

            foreach (Process p in processes)
            {
                try//由于进程不同,有的进程不包含Modules信息,所以要用try保护
                {
                    if (p.Modules != null)
                        if (p.Modules.Count > 0)
                        {
                            System.Diagnostics.ProcessModule pm = p.Modules[0];

                            if (pm.FileVersionInfo.FileVersion.Equals(currentPM.FileVersionInfo.FileVersion))
                            {
                                same++;
                                proList.Add(p);
                            }

                            if (same > 1)
                            {
                                same++;
                                proList.Add(p);
                                if (same > 1)
                                {
                                    for (int i = 0; i < proList.Count; i++)
                                    {
                                        if (((Process)(proList[i])).Id == currentProcess.Id)
                                        {
                                            Console.WriteLine("该进程已经启动了一个实例");
                                            Thread.Sleep(1000);
                                            ((Process)(proList[i])).Kill();
                                        }
                                    }
                                }
                            }
                        }
                }
                catch
                { }
            }
            Console.Read();
        }
    }
}

方法二:直接定义一个属性类,利用此属性信息进行判断。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Diagnostics;
using System.Collections;
using System.Threading;

[assembly: Help("This Assembly demonstrates custom attributes creation and their run-time query.")]
public class HelpAttribute : Attribute
{
    public HelpAttribute(String Description_in)
    {
        this.description = Description_in;
    }
    protected String description;
    public String Description
    {
        get
        {
            return this.description;
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        HelpAttribute HelpAttr1 = null;
        HelpAttribute HelpAttr2 = null;
        Process currentProcess = Process.GetCurrentProcess();                //获取当前正在运行进程
        Assembly a = Assembly.LoadFrom(currentProcess.MainModule.FileName);
        foreach (Attribute attr in a.GetCustomAttributes(true))
        {
            HelpAttr1 = attr as HelpAttribute;
            if (null != HelpAttr1)
            {
                //Console.WriteLine("Description of {0}:\n{1}", currentProcess.MainModule.FileName, HelpAttr1.Description);
                break;
            }
        }
        Process[] processes = Process.GetProcesses();               //获得当前所有进程
        int same = 0;                                               //相同运行实例个数
        ArrayList proList = new ArrayList();                        //将相同实例加入此集合中
        foreach (Process pro in processes)
        {
            try//由于进程不同,有的进程不包含Modules信息,所以要用try保护
            {
                if (pro.Modules != null)
                    if (pro.Modules.Count > 0)
                    {
                        Assembly b = Assembly.LoadFrom(pro.MainModule.FileName);
                        foreach (Attribute attr in b.GetCustomAttributes(true))
                        {
                            HelpAttr2 = attr as HelpAttribute;
                            if (null != HelpAttr2)
                            {
                                if (HelpAttr1.Description.Equals(HelpAttr2.Description))
                                {
                                    same++;
                                    proList.Add(pro);
                                    if (same > 1)
                                    {                                        
                                        for (int i = 0; i < proList.Count; i++)
                                        {
                                            if (((Process)(proList[i])).Id == currentProcess.Id )
                                            {
                                                Console.WriteLine("该进程已经启动了一个实例");

                                                Thread.Sleep(1000);

                                                ((Process)(proList[i])).Kill();

                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
            }
            catch
            {
            }
        }
        Console.ReadLine();
    }

}
参考:C#中的属性http://www.vckbase.com/document/viewdoc/?id=994

标签: c#


Powered by 兔八哥极品软件 苏ICP备12049267号 sitemap