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


    通常我们会遇到这样的情况,让程序只运行一个实例,比如启动杀毒软件时,只能启动一个,再启动的话就没什么效果!利用程序名来判断不是一个好办法,如果我们把程序名称改一下就可以运行两个完全一样的进程。我们最好利用程序集的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
    {
    staticvoid 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.")]
    publicclass HelpAttribute : Attribute
    {
    public HelpAttribute(String Description_in)
    {
    this.description = Description_in;
    }
    protected String description;
    public String Description
    {
    get
    {
    returnthis.description;
    }
    }
    }
    class Program
    {
    staticvoid 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

    ---
    可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
  • 相关阅读:
    KMP
    KMP 算法详解
    快慢指针-链表环入口问题
    算法题——只出现一次的数字
    DECODE 与CASE WHEN 的比较
    Mybatis动态传入tableName--非预编译(STATEMENT)
    mysql数据库出现无法登录(ERROR 1045 ),预防和解决及系列问题解决方法。
    15.linux iptables防火墙规则vsftp服务
    14.LAMP服务 Linux Apache Mysql Php和防护机制 xinetd、tcp wapper
    13.mysql数据库
  • 原文地址:https://www.cnblogs.com/null00/p/2065097.html
Copyright © 2020-2023  润新知