通常我们会遇到这样的情况,让程序只运行一个实例,比如启动杀毒软件时,只能启动一个,再启动的话就没什么效果!利用程序名来判断不是一个好办法,如果我们把程序名称改一下就可以运行两个完全一样的进程。我们最好利用程序集的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.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();
}
}
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