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#