手动下载 .NET Framework 源代码

数月前,微软开放了部分 .NET Framework 源代码,Visual Studio 2008 和 Visual Studio 2005 用户可以通过 配置符号服务器(Symbol Server)获取这部分代码。不过,不象设计 MFC 程序那样编辑时就能进入源代码,Visual Studio 只允许 .NET 程序员调试程序的时候打开当前代码相关的 .cs 文件。这些 .cs 文件没有缓存到本地硬盘,缓存到本地硬盘的是 .pdb 文件,也就是 Visual Studio 程序数据库(Program DataBase)。我们知道,.pdb 是保存程序调试信息的文件,并不包含程序源代码,这对于希望系统阅读 .NET Framework 源代码的用户来说十分不便,于是一款称为 .NET Mass Downloader 的程序应运而生。
顾名思意,.NET Mass Downloader 就是批量下载 .NET Framework 源代码的下载器。它不但能下载 .pdb 文件,还能下载每个 .pdb 文件对应的一系列 .cs 文件。这种做法可能不符合微软的商业利益,但注意到这个软件是发布在微软的开源社区 CodePlex 上的,我猜想它的存在是得到微软许可的。
.NET Mass Downloader 发布有一段时间了,我是昨天才知道它的,也很偶然地下载了它的源代码。因为重装 Visual Studio 2008 发生错误——我安装了 Silverlight 2 Tools Beta 2,接着安装 Visual Studio 2008 SP1 Beta。结果后者安装失败,提示要先卸载 KB944899 这个补丁。这个补丁恰好与 .NET Framework 源代码有关。可是我没有安装 KB944899,猜想可能是 Silverlight 2 Tools Beta 2 安装了其它的补丁涵盖了 KB944899。确实是这样,问题出在 KB949325 上,卸载 KB949325 后一切正常——我顺手打开新下载的 .NET Mass Downloader 源代码测试 Visual Studio 2008 的安装是否成功。
下面的教程就是这次粗略浏览 .NET Mass Downloader 源代码的结果。当然,有了 .NET Mass Downloader 这样好的工具,没有谁会真的去手动下载 .NET Framework 源代码。这篇教程的目的是从侧面窥视微软符号服务器(Microsoft Symbol Servers)的工作原理。
  1. 安装 .NET Framework 3.5
    这一步很重要却往往被忽略。因为目前微软只提供 .NET Framework 3.5 程序集(assembly)的部分源代码,安装其它版本的 .NET Framework,你可能下载不到任何代码,因为同名程序集在不同版本的 .NET Framework 下可能不同。举个例子,所有版本的 .NET Framework 都有 System.dll 这个程序集,它在各版 .NET Framework 下的版本号如表所示:
    .NET Framework 版本 System.dll 版本 编译日期 文件大小
    1.0 1.0.3705.0 2002-1-5 1,136KB
    1.1 1.1.4322.573 2003-2-21 1,188KB
    2.0, 3.0 2.0.50727.42 2005-9-23 2,948KB
    2.0 SP1, 3.0 SP1, 3.5 2.0.50727.1433 2007-10-24 3,004KB
    3.5 SP1 Beta 2.0.50727.3031 2008-4-18 2,964KB
    显然,如果文件的版本不一样,它的源代码也不一样。这就是安装 .NET Framework 3.5 的原因。对于这个问题,我想再严谨些。下载 .NET Framework 源代码,其实并不一定非要安装 .NET Framework,安装 .NET Framework 只是简便的做法。读完下面的步骤我们可以知道,这里真正需要的是要下载的源代码对应的那个程序集文件,类似于上面例子中的 System.dll。你有许多办法获得这个文件,比如下载 .NET Framework 3.5 安装包,手动从中提取文件。
  2. 为浏览器添加新的 User-Agent:Microsoft-Symbol-Server/6.8.0004.0。
    • 如果你的浏览器是 Internet Explorer 7,你可以在注册表 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/
      CurrentVersion/Internet Settings/5.0/User Agent/Post Platform 位置新建字符串(REG_SZ),值为 Microsoft-Symbol-Server/6.8.0004.0,数据留空。
    • 如果你的浏览器是 FireFox 3,你可以在 about:config 页面中新建字符串 general.useragent.override,设置它的值为 Microsoft-Symbol-Server/6.8.0004.0。
    • 如果你使用其它浏览器,如 Maxthon,或者安装了浏览器增强插件,如 IE7Pro,你可以尝试在它们的配置中设置 User-Agent 的值。
    这一步是为了让符号服务器能够识别其后的下载请求。设置完成后需要重启浏览器。
  3. 在程序集文件中检索 PDB 信息
    以 mscorlib.dll 2.0.50727.1433 为例,它一般位于 C:/Windows/Microsoft.NET/Framework/v2.0.50727 目录下。
    • 如果你安装了 Visual C++,你可以用它的命令行工具 dumpbin 导出整个 mscorlib.dll 的 PE 结构信息。找到 Debug Directories 一段,注意 Format 后面的值:RSDS, {56470DDE-A10F-45F4-A409-7FF9274F4923}, 1, mscorlib.pdb。
      这是 CV_INFO_PDB70 结构的数据,含义如下:
      类型 名称 含义
      DWORD CvSignature RSDS 表明当前 CodeView 块的格式是 PDB 7.0
      GUID Signature {56470DDE-A10F-45F4-A409-7FF9274F4923} .pdb 文件的数字签名
      DWORD Age 1 .pdb 文件的增量更新标识
      BYTE[] PdbFileName mscorlib.pdb 以 /x0 结尾的 .pdb 文件的文件名
    • 如果你熟悉 PE/COFF 的结构,可以用普通的十六进制编辑器查找字符串“RSDS”,或者依 PE 结构顺次找到下面的数据:
    这些数据用于在符号服务器上定位 .pdb 文件。
  4. 下载 http://referencesource.microsoft.com/symbols/mscorlib.pdb/56470DDEA10F45F4A4097FF927
    4F49231/mscorlib.pd_
    不难看出这个地址是如何来的:
    • 首先是微软符号服务器地址 http://referencesource.microsoft.com/symbols;
    • 其次是 .pdb 文件的文件名 mscorlib.pdb;
    • 再次是它的 GUID 56470DDEA10F45F4A4097FF9274F4923;
    • 而后是增量更新标识 1;
    • 最后还是 .pdb 的文件名,不同的是,这里的扩展名为 .pd_。
    顺便提一下,直接用 Internet Explorer 下载这个文件常常会半途中断,而且 IE7Pro 的 MiniDM 不支持 User-Agent 设置。因此这里 FireFox 是更好的选择,用它直接下载或者通过 FlashGot 插件下载均可。如果是直接下载,和 Internet Explorer 一样,下载的内容会以网页形式呈现。这时不能直接保存页面,而应该打开页面的源代码,在那里保存文件为 mscorlib.pd_。
  5. 解压下载的 mscorlib.pd_
    mscorlib.pd_ 是 cab 格式的文件,常见的压缩工具都支持这种格式。也可以用 Windows 自带的命令行工具 expand 解压。解压后得到 mscorlib.pdb。
  6. 在 mscorlib.pdb 中找出源代码文件的下载地址
    用文本编辑器打开 mscorlib.pdb,在乱码后面找到字符串 SRCSRV: ini --------------------------------------------。从这里开始的文本记录了 mscorlib.dll 源代码文件的文件名和其它必要信息。注意下面几个重要的名称/值对:
    • 形如 HTTP_ALIAS=Http://ReferenceSource.microsoft.com/source/.net/8.0 的根地址;
    • 形如 HTTP_EXTRACT_TARGET=%HTTP_ALIAS%/%var2%/%var3%/%var4%/%fnfile%(%var1%) 或者,
    • 形如 SD_EXTRACT_TARGET=%targ%/%var2%/%fnbksl%(%var3%)/%var4%/%fnfile%(%var1%) 的逻辑地址。
    逻辑地址要转换成真实地址,还必须有上面各变量 %x% 的实际值,这些值就在形如 f:/RedBits/ndp/clr/src/BCL/System/
    Object.cs*DEVDIV*depot/DevDiv/releases/whidbey/REDBITS/ndp/clr/src/BCL/System/Object.cs*1 的字符串中。
    就以这个字符串为例,它对应的逻辑地址是 %targ%/%var2%/%fnbksl%(%var3%)/%var4%/%fnfile%(%var1%)。
    • 用固定地址 Http://ReferenceSource.microsoft.com/source/.net/8.0 替换 %targ%。如果逻辑地址包含的变量是 %HTTP_ALIAS% 而不是 %targ%,则用相应的 HTTP_ALIAS 值替换;
    • 把上面的字符串以星号为分隔符分成四节:
      • 用第一节中的文件名 Object.cs 替换 %fnfile%(%var1%);
      • 用第二节 DEVDIV 替换 %var2%;
      • 用第三节 depot/DevDiv/releases/whidbey/REDBITS/ndp/clr/src/BCL/System/Object.cs 替换 %var3%;
      • 用第四节 1 替换 %var4%;
    • 把 %fnbksl% 括号中值的斜杠号替换成反斜杠号。
  7. 下载 Object.cs 源代码
    用浏览器打开上面的地址,微软符号服务器并没有直接返回要下载的文件,而是返回一份 EULA(最终用户许可协议)。找到协议中形如 Accept=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 的字符串。把这串字符作为之前地址的参数,添加到它的后面。这就得到了最终的地址: http://referencesource.microsoft.com/source/.net/8.0/devdiv/depot/devdiv/releases/whidbey/
    redbits/ndp/clr/src/bcl/system/object.cs/1/object.cs?accept=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    ,这就是我们要下载的 Object.cs 源代码的地址。
就在我写这篇教程的时候,Microsoft Symbol Servers 正巧在调整,时时连接不上,并且下载到的 .pd_ 文件版本也不一样。如果你也遇到这种情况,请隔天再试。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值