方法一:
[STAThread]
static void Main() { bool isAppRunning = false;
}
注:也可以这样设置Mutex 
方法二(API):
-  [STAThread] 
-  static void Main() 
-  { 
-  //Get the running instance. 
-  Process instance = RunningInstance(); 
-  if (instance == null) 
-  { 
-  System.Windows.Forms.Application.EnableVisualStyles(); 
-  System.Windows.Forms.Application.DoEvents(); 
-  
-  //There isn’t another instance, show our form. 
-  Application.Run(new Form1()); 
-  } 
-  else 
-  { 
-  //There is another instance of this process. 
-  HandleRunningInstance(instance); 
-  } 
-  } 
-  
-  public static Process RunningInstance() 
-  { 
-  Process current = Process.GetCurrentProcess(); 
-  Process[] processes = Process.GetProcessesByName(current.ProcessName); 
-  
-  //Loop through the running processes in with the same name 
-  foreach (Process process in processes) 
-  { 
-  //Ignore the current process 
-  if (process.Id != current.Id) 
-  { 
-  //Make sure that the process is running from the exe file. 
-  if (Assembly.GetExecutingAssembly().Location.Replace(“/”, “\”) == current.MainModule.FileName) 
-  { 
-  //Return the other process instance. 
-  return process; 
-  } 
-  } 
-  } 
-  //No other instance was found, return null. 
-  return null; 
-  } 
-  
-  public static void HandleRunningInstance(Process instance) 
-  { 
-  //Make sure the window is not minimized or maximized 
-  ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL); 
-  //Set the real intance to foreground window 
-  SetForegroundWindow(instance.MainWindowHandle); 
-  } 
-  
-  [DllImport(“User32.dll”)] 
-  private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow); 
-  [DllImport(“User32.dll”)] 
-  private static extern bool SetForegroundWindow(IntPtr hWnd); 
-  
-  //1:normal 
-  //2:minimized 
-  //3:maximized 
-  private const int WS_SHOWNORMAL = 3; 
一般都用方法一和方法二
方法三
把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();
}
}