20110610 DiscuzNT代码研究(一)
20110610 DiscuzNT代码研究(一)
1. 源代码下载
http://nt.discuz.net/showtopic-140676.html
2. 用VS2010打开项目
3. 项目结构
4. Discuz.Web
4.1. 文件夹结构
本项目是网站最终的项目,对比网站发布的文件夹
Discuz.web项目文件夹
4.2. 关于Bin文件夹
网站所有需要的dll文件都放在Bin文件夹中,总共27个dll文件,其中Discuz自身有22个,刚好对应解决方案的22个项目(其中Discuz.web是网站项目,不生成dll文件),其他dll文件是另外引用的,在“RefDLL”目录下。
5. 如何研究DiscuzNt
1) 研究Discuz.web网站结构
2) 研究dll文件
6. 关于DiscuzNt的运行过程
6.1. 系统安装
一步一步来
我们先按照http://faq.comsenz.com/viewnews-989配置好网站,第一步就是要安装
这时系统会自动跳转的“Install.aspx”页面
6.2. 我们从安装开始分析
既然我们知道入口了,我们就先从安装开始分析
7. Discuz.Web
7.1. install
7.1.1. index.aspx
7.1.1.1. 代码分析方法
1) 截图
2) 分析类成员(UML)
3) 分析类成员的实现和作用(深入源代码)
7.1.1.2. 截图
7.1.1.3. 分析类
从代码的前段,可以看出index.aspx页面没有相应的cs文件,本页面将在被浏览器请求的时候,自动编译一个继承与Page类的页面出来。
为了好分析,我们假设生成的类为index.aspx类
index.aspx的第一行,置顶了本页面的编译语言为C#
<%@ Page Language="C#"%> |
index.aspx的C#代码是在<script runat="server">…</script>体现出来。
7.1.1.4. 分析类成员
我们为_Index_Page类画一个UML图,借助“EnterpriseArchitect”工具,非常不错的一个UML建模工具。
从UML类图中可以看出,index.aspx基本上就是一个Page_Load方法,两个字段,这个方法和字段主要做什么作用呢?
7.1.1.5. 分析类成员实现与作用
7.1.1.5.1. Page_Load
如何来分析Page_Load方法,实际上应该是事件方法,这个主要解决什么问题呢?
为了调试某个方法具体作用,有些时候我们需要在方法中添加一些测试方法
这里,我们添加了一个测试方法“Response.Write(binfolderpath);”,并注释后续的代码,我们的目的是要只要HttpRuntime.BinDirectory返回的是什么样的值,返回结果值如下:
G:\WebServer\DiscuzNt360\source_files\Discuz.Web\bin\ |
即HttpRuntime.BinDirectory返回的是当前应用程序的 /bin 目录的路径。
7.1.1.6. 知识点
- HttpRuntime.BinDirectory
- ArrayList inexistenceAssemblyList = new ArrayList();
- foreach (string assembly in assemblylist)
- System.IO.File.Exists(binfolderpath + assembly)
- inexistenceAssemblyList.Add(assembly);
- msg += "<li>" + assembly + " 中.</li>";
- binfolderpath.Replace("bin\\", "")