搜索: 标题内容作者  
  首页C#教程C#实例
背景:
阅读新闻

C#中让程序只运行一个实例的操作方法

[日期:2008-12-25]   来源:互联网整理  作者:佚名   [字体: ]
    新闻简介: 让程序只运行一个实例,比如启动杀毒软件时,只能启动一个,再启动的话就没什么效果!利用程序名来判断不是一个好办法,如果我们把程序名称改一下就可以运行两个完全一样的进程。我们最好利用程序集的Attribute存放特定信息,然后用Assembly对象的GetCustomAttributes()方法获取该信息进行判断。
        关 键 词:  
让程序只运行一个实例,比如启动杀毒软件时,只能启动一个,再启动的话就没什么效果!利用程序名来判断不是一个好办法,如果我们把程序名称改一下就可以运行两个完全一样的进程。我们最好利用程序集的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();
}


}

If you believe an article violates your rights or the rights of others, please contact us.

收藏 推荐 打印 | 录入:admin | 阅读:
相关新闻      
友情链接
本文评论   [发表评论] 全部评论 (0)
赞助商广告
热门评论