Welcome

首页 / 软件开发 / .NET编程技术 / Paint.Net学习笔记——一、启动

Paint.Net学习笔记——一、启动2011-08-20 博客园 懵盛盛把从http://www.afterdawn.com/software/source_codes/paint.net.cfm下载到的PDN3.05源码下载 下来后,解压出来src目录下就是PDN的解决方案目录了,可以使用VS2005或VS2008打开解决方案。

在所有工程中,核心的工程为 DataEffectsPaintdotnetPdnLibSystemLayer。而其中 Paintdotnet是启动项目,程序从Startup.cs启动。

现在我们就来看看PDN的启动有什么奥秘吧。

Startup的构造函数接受一个string[]作为启动参数。

应用程序从Main方法启动,我们一起一步一步看看PDN是怎么启动的。

使用Main方法的启动参数构造一个新的Startup对象,并调用Start方法。

Start方法中,一进来就注册了应用程序域的异常事件,这样做,就防止了应用程序域中的任何未捕 捉到异常弹出.net异常对话窗口导致用户不知所措。

接下来检查系统DPI兼容,在这里我们一路跟踪定义,进入了SafeNativeMethods类中,发现此类不简 单,这里除了方法定义外,没有方法的实现,都是清一色的[DllImport]。小弟系井底之蛙,一开始搞不 懂这个属性是什么意思,于是翻查MSDN:

发现[DllImport]描述的方法,都是调用了windows本身的非托管代码,并一定要加上extend关键字以 及都必须为静态方法。

而在此调用的SetProcessDPIAware说明在此:http://msdn.microsoft.com/zh- cn/library/aa970067.aspx

接下来如果启动参数中不包含"/skipRepairAttempt",进入StartPart2。

PDN对应多种语言系统,并能加载不同的语言资源,这是怎么做到的呢?

跟踪进入Settings类,在类的顶部,定义了两个只读变量:

public static readonly Settings SystemWide = new Settings (Microsoft.Win32.Registry.LocalMachine);
public static readonly Settings CurrentUser = new Settings (Microsoft.Win32.Registry.CurrentUser);

这两个变量获取了注册表中LocalMachine和CurrentUser键的所有值,返回Startup中,StartPart2中 第一句就是查询CurrentUser的"LanguageName"的值,这个键是在安装PDN时写入的,在注册表的路径 “HKEY_CURRENT_USERSoftwarePaint.Net”中。在我机器上该值为“zh-CN”,使用该值构造 CultureInfo,并设置到当前进程中: