扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:中国IT实验室 来源:中国IT实验室 2007年9月10日
关键字:
/// <summary>
/// 获取或设置程序运行标志,必须符合Windows文件命名规范
/// 这里实现生成临时文件为依据,如果修改成设置注册表,那就不需要符合文件命名规范。
/// </summary>
public static string RunFlag
{
get
{
if(runFlagFullname == null)
{
string assemblyFullName = Assembly.GetEntryAssembly().FullName;
//CommonApplicationData://"C:\\Documents and Settings\\All Users\\Application Data"
string path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
//"C:\\Program Files\\Common Files"
//string path = Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFiles);
runFlagFullname = Path.Combine(path, assemblyFullName);
}
return runFlagFullname;
}
set
{
runFlagFullname = value;
}
}
#endregion
}
}
Program.cs文件,
using System;
using System.Windows.Forms;
using System.Diagnostics;
using Zhengzuo.CSharpCode;
/*------------------------------------------------
郑佐 2006-07-01 http://blog.csdn.net/zhzuo
--------------------------------------------------*/
namespace Zhengzuo.Test.WinGui
{
static class Program
{
[STAThread]
static void Main(string[] args)
{
if (args.Length == 0) //没有传送参数
{
Process p = SingleInstance.GetRunningInstance();
if (p != null) //已经有应用程序副本执行
{
SingleInstance.HandleRunningInstance(p);
}
else //启动第一个应用程序
{
RunApplication();
}
}
else //有多个参数
{
switch (args[0].ToLower())
{
case "-api":
if (SingleInstance.HandleRunningInstance() == false)
{
RunApplication();
}
break;
case "-mutex":
if (args.Length >= 2) //参数中传入互斥体名称
{
if ( SingleInstance.CreateMutex(args[1]) )
{
RunApplication();
SingleInstance.ReleaseMutex();
}
else
{
//调用SingleInstance.HandleRunningInstance()方法显示到前台。
MessageBox.Show("程序已经运行!");
}
}
else
{
if (SingleInstance.CreateMutex())
{
RunApplication();
SingleInstance.ReleaseMutex();
}
else
{
//调用SingleInstance.HandleRunningInstance()方法显示到前台。
MessageBox.Show("程序已经运行!");
}
}
break;
case "-flag"://使用该方式需要在程序退出时调用
if (args.Length >= 2) //参数中传入运行标志文件名称
{
SingleInstance.RunFlag = args[1];
}
try
{
if (SingleInstance.InitRunFlag())
{
RunApplication();
SingleInstance.DisposeRunFlag();
}
else
{
//调用SingleInstance.HandleRunningInstance()方法显示到前台。
MessageBox.Show("程序已经运行!");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
break;
default:
MessageBox.Show("应用程序参数设置失败。");
break;
}
}
}
//启动应用程序
static void RunApplication()
{
Application.EnableVisualStyles();
Application.Run(new MainForm());
}
}
}
运行CMD命令行,
第一种调用方式:
WindowsApplication1.exe
或 WindowsApplication1.exe ?api
第二种调用方式:
WindowsApplication1.exe ?mutex
或WindowsApplication1.exe ?mutex {F140AE26-626C-42f8-BD49-45025742205E}
第三种调用方式:
WindowsApplication1.exe ?flag
或WindowsApplication1.exe ?flag c:\blog.csdn.net.zhzuo
匹配/互斥/标志 | 1同一目录 | 2修改名称 | 3不同目录 | 4不同用户 | 5远程访问 |
1同一目录 | O/O/O | ||||
2修改名称 | X/O/O | ||||
3不同目录 | X/O/O | ||||
4不同用户 | #/X/O | ||||
5远程访问 | X/O/O |
针对远程访问的测试,需要在系统管理工具的.NET Framework 2.0 Configuration中进行设置授权该局域网路径允许访问,否则会抛出System.Security.SecurityException异常。
根据测试结果可见三种实现方式适用范围不同,理想的实现是结合他们的优点进行多点判断。
更多资源
关于.NET平台应用的开发,更多的技术文章可以访问http://blog.csdn.net/zhzuo,对于本文的建议或意见可在网站上留言。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者