手记

秋式广告杀手V2.5发布:各种涉及知识点分享

经过一个多月,终于发布了秋式广告杀手新版本V2.5了,由于基本上问题很少,所以更新周期就长一些。

 

这里谈一点这次改动涉及到的内容和知识点:

1: 去掉了最初依赖的Hosts模式,所以对Hosts的增删改代码都去除了。

2: 百度竞价广告的屏蔽,除了原有的百度搜索,增加百度知识页面的广告屏蔽。

3: 增加了一台服务器,提供默认一剑出墙的服务。

4: 针对默认代理功能,经过层层思考,允许软件在不同目录下的时候可以开多个,以监听不同的端口,变成一款多端口代理软件。


下面分享几个升级中,被我记住的知识点:

 

1:线程的try catch的必要性:

先说下线程异常的危害性:

1:winform程序:线程异常,若未try,会导致软件自动退出。

2:webform程序:线程异常,若未try,会导致应用程序池重启,类似网站重启。

 

总结:

别太过份相信自己对代码的掌控,只要是线程的代码函数,都加个try保险,我这种层次的都逃不过万一的某种错误,对于软件,真是稳定压倒一切。

 

2: 软件只能启动单个实例的知识点:

有时候,我们只允许软件启动一个实例,所以我们通常会有这么段通用代码检测:

static class Program{        public static System.Threading.Semaphore _mutex;        /// <summary>        /// 应用程序的主入口点。        /// </summary>        [STAThread]        static void Main()        {            _mutex = new System.Threading.Semaphore(1, 1, "adkiller");            if (_mutex.WaitOne(0, false) == false)            {                MessageBox.Show("软件已经启动过了!", "运行提示");                return;

            } 

 

需要有点变化:这次的升级, 需要变成了在不同的目录允许多开,所以,按逻辑,我写下了这么段代码:

    Process cp = Process.GetCurrentProcess();            Process[] allPros = Process.GetProcessesByName(cp.ProcessName);            processCount = allPros.Length;            if (processCount > 1)            {                foreach (Process pro in allPros)                {                    if (cp != pro && cp.MainModule.FileName == pro.MainModule.FileName)                    {                        MessageBox.Show("软件已经启动过了!", "运行提示");                        return;                    }                }

            } 

 

 

这里又涉及到两个知识点:

1:调试期的问题:

在调试的时候,默认有个.vshost宿主,导致调试后运行的软件名称为:秋式广告杀手.vshost.exe

我要测试多个不同目录的软件运行,所以在其它目录也运行了软件,问题来了:

调试的进程“秋式广告杀手.vshost.exe”和直接运行的“秋式广告杀手.exe”,是对不上号的。

解决方法:

这时候,只要把:项目-右键属性-调试-启用VS宿主进程的勾去掉就可以了。

 

2:想当然的错误:

以为Process.GetCurrentProcess()获取出来的当前进程对象,总会和获取进程列表里的同个进程对象一样,所以才有了cp==pro这样的对象比较判断。

实际的错误:

用Process.GetCurrentProcess出来的对象,和循环进程的每一个pro对象都是不等的,所以直接的判断是错误。

 

网上这样相当然的错误代码有点多:

一开始,我也网上搜了搜,发现好多和我写的相当然的代码一样,网上也有这种用=号判断出错误示例代码,大伙要注意下。

解决方法:

经过本人细心的发现,对于进程,其进程ID是一样的,于是把判断的语句改成:

cp.Id!=pro.Id

通过进程ID来判断是否同一进程。

 

好了,本节,基本就分享这两个相对被我记住的知识小点。 

 

软件升级:软件重启运行,系统会自动升级。


0人推荐
随时随地看视频
慕课网APP