C#程序防多开又一法

功能:可防止exe更名、挪动位置再运行的问题

实现思路:

在Main()方法开始时遍历所有进程,获取每个进程的程序集GUID和PID,若发现有跟自己GUID相同且PID不同的进程,就勒令自身退出。

注:

1、采用GUID是为了尽可能保证判定的可靠性,采用进程名太不靠谱。因为程序集GUID是建立项目时就生成的,不随版本、内容的变化而变化,所以除非人为改动,否则同一项目编译若干次都还是那个GUID,用来判断程序集身份再适合不过。题外,市面上常见的互斥体方法,互斥名也建议采用GUID;

2、之所以要加上进程ID的判断,是因为遍历的进程中已经包含自身进程,所以必须排除自身;

3、经尝试似乎只有.Net程序集才能获取到GUID(有点废话~),但这样已经足够

4、第一次在cnblogs写博,希望各位前辈多多指教~少扔砖头

using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace TestCallAPIRefreshPolicy
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Guid ownGUID = new Guid(((GuidAttribute)Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(GuidAttribute))).Value);
            int ownPID = Process.GetCurrentProcess().Id;

            foreach (Process p in Process.GetProcesses())
            {
                try
                {
                    //这儿之所以用Assembly.Load(byte[])获得程序集是因为该方法不会锁住文件
                    Guid proGUID = new Guid(((GuidAttribute)Attribute.GetCustomAttribute(Assembly.Load(File.ReadAllBytes(p.MainModule.FileName)), typeof(GuidAttribute))).Value);
                    if (ownGUID == proGUID && ownPID != p.Id)
                    {
                        MessageBox.Show("程序已运行");
                        return;
                    }
                }
                catch { }//访问某些进程的MainModule会引发异常,必须波或
            }

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FmMain());
        }
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏跟着阿笨一起玩NET

WebService基于SoapHeader实现安全认证

      本文仅提供通过设置SoapHeader来控制非法用户对WebService的调用,如果是WebService建议使用WSE3.0来保护Web服务,如...

1612
来自专栏linjinhe的专栏

LevelDB:使用介绍

Get 接口和 Put 接口比较像,除了 leveldb::ReadOptions 参数是用来控制读操作的,具体见链接指向的代码。

6665
来自专栏大内老A

在ASP.NET MVC中通过URL路由实现对多语言的支持

对于一个需要支持多语言的Web应用,一个很常见的使用方式就是通过请求地址来控制界面呈现所基于的语言文化,比如我们在表示请求地址的URL中将上语言文化代码(比如e...

2176
来自专栏葡萄城控件技术团队

ASP.NET 5系列教程(七)完结篇-解读代码

在本文中,我们将一起查看TodoController 类代码。 [Route] 属性定义了Controller的URL 模板: [Route("api/[con...

2115
来自专栏大内老A

WCF版的PetShop之三:实现分布式的Membership和上下文传递

通过上一篇了解了模块内基本的层次划分之后,接下来我们来聊聊PetShop中一些基本基础功能的实现,以及一些设计、架构上的应用如何同WCF进行集成。本篇讨论两个问...

2585
来自专栏技术小讲堂

State模式的经典应用场景:订单处理(c#实现)场景描述遇到问题解决问题走起

State模式在对象内部状态发生变化的时候,改变自身的行为,这通常是通过切换内部状态对象实现的,对象将自身在各个状态的行为推给了状态对象,从而解开了行为与对象的...

2794
来自专栏技术博客

菜菜从零学习WCF九(会话、实例化和并发)

在服务协定上设置System.ServiceModel.ServiceContractAttribute.SessionMode值

963
来自专栏跟着阿笨一起玩NET

WinForm程序启动控制台窗口Console

本文转载:http://blog.csdn.net/oyi319/article/details/5753311

2301
来自专栏菩提树下的杨过

mongodb 速成笔记

以下环境为mac osx + jdk 1.8 + mongodb v3.2.3 一、安装 brew安装方式是mac下最简单的方式 brew update bre...

2205
来自专栏菩提树下的杨过

webservice今日遇到的二个问题:DataTable + Namespace

自从ms推出wcf以后,几乎没在web项目中用过webservice了,基本上都是以wcf host在iis中替代的。今天利用公司以前的web框架做一个新项目,...

2258

扫码关注云+社区

领取腾讯云代金券