65.9K
CodeProject 正在变化。 阅读更多。
Home

.NET Mass Downloader - 下载 .NET Framework 源代码

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (43投票s)

2008 年 2 月 11 日

Apache

12分钟阅读

viewsIcon

329985

downloadIcon

1745

有了这个工具,您可以一次性下载整个 .NET Framework 源代码,并享受离线浏览的乐趣。有了它,即使没有安装任何 Visual Studio 产品,您也可以拥有完整的源代码。

下载次数

引言

更新 2010 年 4 月 26 日 (请从 Codeplex 下载最新版本)

我发布了一个新版本 1.6.0.0,它具有以下功能:

  • 增加了对 .Net 4.0 和 VS2010 支持的通用提取支持。
  • 源代码文件目标现在从 srvsrc 文件中提取,不再是硬编码。
  • 支持的 VS 版本已添加到 config 文件中,无需更改源代码即可扩展。
  • 已应用通用代码清理。
  • 解决方案文件已升级到 VS2008,并添加了 VS2010 解决方案文件。

更新 2008 年 8 月 31 日

我发布了一个新版本 1.5.0.1,它修复了以下错误:

  • 增加了对 VS2008 SP1 源代码下载的支持,您现在可以下载 Framework 3.5 SP1 的源代码。
  • 损坏或零字节的 pdb 文件不再会导致程序崩溃。
  • 缺失的 srvsrc 文件不再会导致空引用异常。
  • 已将 SrvSrc 文件提取器添加到项目源代码中,供感兴趣的人员使用。

更新 2008 年 8 月 29 日

我发布了一个新版本 1.4,它具有以下功能:

  • 增加了对 VS2008 SP1 源代码下载的支持,您现在可以下载 Framework 3.5 SP1 的源代码。

更新 2008 年 6 月 27 日

我发布了一个新版本 1.3,它具有以下功能:

  • 允许递归处理子文件夹中的 DLL 或 EXE 文件(除了顶层目录)。
  • 允许清理临时压缩的 *.pd_ 文件。
  • 允许从 Microsoft 符号服务器 (msdl.microsoft.com) 下载本地 DLL 或 EXE 文件的零售符号(通过在 NetMassDownloader.exe.config 中将 UseReferenceSourceServer 设置为 "false")。
  • 使符号服务器的 URL 可在 NetMassDownloader.exe.config 中进行配置。
  • 允许通过在 NetMassDownloader.exe.config 中设置 DownloadSourceCode(默认为 "true")来指定是仅下载符号而不下载源代码。
  • 如果可用,则使用服务器上的原始文件日期-时间。
  • 下载现在是异步的;可以看到每个文件(符号或源代码)的下载进度。
  • 改进了控制台输出。输出不那么冗长,现在易于阅读。
  • 允许为现有符号文件恢复下载剩余的源代码文件(通过在 NetMassDownloader.exe.config 中将 SkipExistingSourceFiles 设置为 "true"(默认值))。

所有这些功能都可以通过 NetMassDownloader.exe.config 文件进行控制。

更新 2008 年 5 月 21 日:一个 Windows 客户端将在几天内可用,它可以自动执行下载后的必要步骤。请关注。请将您所有的愿望发送到项目页面,以便我将其包含在下一个版本中。

更新:代理支持已得到改进。如果您在使用身份验证代理时遇到下载问题,请获取最新版本。

欢迎来到 .NET Mass Downloader 项目。虽然 Microsoft 发布了 .NET Reference Source Code 是一件好事,但您只能在调试时逐个文件获取它。如果您想批量下载它用于阅读或填充缓存,您需要编写一个程序来实例化并调用 Framework Class Library 中的每个方法。幸运的是,.NET Mass Downloader 可以为您排忧解难!

该工具支持 VS2008、VS2008 Express Edition、VS2005 和 Codegear Rad Studio 的离线调试。

使用此工具所需的一切就是安装 .NET Framework 3.5 RTM。有了它,即使没有安装任何 Visual Studio 产品,您也可以拥有完整的源代码。如果您使用的是 Vista,请确保您是以管理员权限运行的。

背景

正如大家所知,** .NET Framework 3.5 源代码** 几周前通过 **Visual Studio 2008** 的一个小插件安装后已经公开。

该工具的实际缺点是,它不支持一次性下载整个框架代码,也没有一个接一个地下载每个类的源代码文件。另外,由于每次都下载,因此无法离线使用此功能,也就无法进行离线调试。

也无法在 **VS2005 和 VS2008 Express Editions** 中使用此有用功能。

我们的工具使您能够使用所有这些缺失的功能。

来自 **John Robbins 博客关于我们项目** 的一些小笔记:

Kerem Kusmezer 联系了我,他说他一直在研究 Fiddler,并找到了从 Microsoft 下载 PDB 和代码的方法。

他问我是否有兴趣帮助他开发这个工具,我想我从来没有这么快地写过回复!

Kerem 已经与 Shawn Burke 就制作源代码下载器的合法性问题进行了讨论,在我们得到非常积极的“放手去做”的回复后,我们开始工作。

工具的所有功劳都归功于 Kerem Kusmezer。

他在理解 HTTP 下载、PE 文件处理和 PDB 流提取方面做了所有真正困难的工作。

我负责控制台驱动程序、大量的测试,并惊叹于 Kerem 在如此短的时间内能完成如此多的工作。

我非常感谢 Kerem 允许我和他一起参与这个项目,并成为他的代码猴子。

必备组件

第一次运行 Net Mass Downloader 时,系统会提示您阅读当前的 EULA 以访问源代码。如果您不同意 Microsoft 的 EULA,点击“拒绝”按钮将不会下载源代码。

您必须安装 **.NET Framework 3.5 RTM 版本** 才能访问源代码,即使您使用的是 VS2005。

使用代码

该工具实现为一个命令行应用程序,运行后会显示以下帮助屏幕:

netmassnewscreen.PNG

唯一必需的参数是 –file 或 –directory,两者都可以指定任意多次。指定目录时,将仅处理该目录中的 .DLL 和 .EXE 文件。如果您想下载 .NET 2.0 32 位和 64 位目录中二进制文件的所有源代码,您将传递的命令行是:

-d C:\Windows\Microsoft.NET\Framework\v2.0.50727 –d C:\Windows\Microsoft.NET\Framework64\v2.0.50727

Net Mass Downloader 的主要目的是填充用于调试的源代码下载缓存,默认下载位置是您在 Visual Studio 2008 中指定的缓存。我们添加了 –vsver 开关以应对未来的 Visual Studio 版本,这样 Mass Downloader 就可以与未来的 CTP 和版本一起工作。

虽然在 Visual Studio 2008 中看到 .NET Reference Source Code 很好,但仍有许多开发者目前无法升级。

VS2005 NetMassDownloader 设置

起初,我们尝试修补 PDB 文件,以便 Visual Studio 2005 用户可以访问 .NET Reference Source Code。经过一番折腾,我们发现了一个更容易的方法。如果您指定 –output 开关,我们将把 PDB 和源代码放入该目录,使用生成路径而不是源服务器路径。因此,如果您的命令行是 –d C:\Windows\Microsoft.NET\Framework\v2.0.50727 –output c:\ReferenceSource,那么 PDB 文件将与源文件一起放在 C:\ReferenceSource 中。

要使用 .NET Reference Source 与 Visual Studio 2005,您需要执行以下三个额外步骤。第一个是在 Visual Studio 的“选项”对话框中,选择“调试”,“符号”属性页。在“符号文件 (.pdb) 位置”列表框中,您将添加“*c:\ReferenceSource*”,如下所示。

020608_0256_DownloadAll1.png

第二个设置是在“选项”对话框中,“调试”,“常规”属性页,取消选中“源文件必须与原始版本完全匹配”。

020608_0256_DownloadAll2.png

最后一步是在您想要访问下载的 .NET Reference Source Code 的每个解决方案中,进入解决方案属性页,“通用属性”,“调试源文件”,并将 *C:\ReferenceSources* 添加到“包含源代码的目录”列表框的顶部,如下所示。

020608_0256_DownloadAll3.png

Visual Studio 2005 将自动执行正确的操作,并用 c:\ReferenceSource 替换 PDB 文件中找到的每个源文件的第一个目录。借助 Visual Studio 2005 的自动化模型,我相信您可以创建一个宏来自动在解决方案中设置该路径。

VS2008 Express Edition 设置

起初,我们尝试修补 PDB 文件,以便 Visual Studio 2005 用户可以访问 .NET Reference Source Code。经过一番折腾,我们发现了一个更容易的方法。如果您指定 –output 开关,我们将把 PDB 和源代码放入该目录,使用生成路径而不是源服务器路径。因此,如果您的命令行是 –d C:\Windows\Microsoft.NET\Framework\v2.0.50727 –output c:\ReferenceSource,那么 PDB 文件将与源文件一起放在 C:\ReferenceSource 中。

要使用 .NET Reference Source 与 Visual Studio 2008 Express Edition,您需要执行以下三个额外步骤。第一个是在 Visual Studio 的“选项”对话框中,选择“调试”,“符号”属性页。在“符号文件 (.pdb) 位置”列表框中,您将添加“*c:\ReferenceSource*”,如下所示。

首先,请确保在 VS2008 “选项”->“调试”->“常规”对话框中未选中“源文件必须与原始版本完全匹配”。

20081.PNG

之后,勾选屏幕左下角的“显示所有设置”复选框。

如果勾选了“显示所有设置”,屏幕将如下所示:

20082.PNG

在此处,请转到“符号位置”,将您在 -output 目录中指定的“目标路径”添加进去。例如,我们假设您使用了以下命令行参数来执行 NetMassDownloader:

netmassdownloader.exe -d c:\winnt\microsoft.net\framework\v2.0.50727 -output c:\cachetest -v

您将看到一个与此类似的窗口:

downloadprogress.PNG

只需在符号对话框中写入输出目录 c:\cachetest 即可。

之后只剩一步,您就可以在 VS2008 Express Edition 中享受 .net framework 的调试了。

只需在 VS2008 Express Edition 中打开一个新解决方案,转到“解决方案属性”对话框,然后按如下方式添加上述目录:

20083.PNG

现在,您就可以在 VS2008 Express Edition 中使用 F11 键离线调试 .net framework 的源代码了。

其他说明

第一次运行 Net Mass Downloader 时,系统会提示您阅读当前的 EULA 以访问源代码。如果您不同意 Microsoft 的 EULA,点击“拒绝”按钮将不会下载源代码。虽然您可能会想移除 EULA 检查,但我强烈建议您不要这样做,因为 Microsoft 已表示他们可能会随时更改 EULA。您最不希望看到的情况是,您被一项可能影响您生活的许可变更所困扰。

我们需要感谢的一个群体是 Microsoft 的 Developer Division。首先,他们发布了 .NET Reference Source Code,其次,他们允许两位开发人员尽情发挥并为社区提供实用工具。

一如既往,如果您遇到任何错误或有功能要求,请在 CodePlex 上告知我们。

关注点

在实现过程中,我学到了以下几点:

a) PDB 文件的分解和解析。事实上,我为此目的将一个 PDB 解析器移植到了 C#。

b) PE 文件的分解和解析,在其中查找所需的调试信息部分。

c) Srcsrv 文件解析器,它还解析 srcsrv 文件中包含的 srcsrv 宏。

d) 一个自定义的 WebClient 类,有助于 EULA 下载。

项目结构

该解决方案由 2 个项目组成:DownloadLibraryNetMassDownloader 控制台应用程序。

DownloadLibrary 类库的每个组件分解开来,它们是:

  1. DownloadLibrary.PEParsing.PEFile 负责 PE 头和调试目录解析及检测的类,也负责 PDB 下载和 URL 创建。使用 IMAGE_DOS_HEADER、PESectionHeader、CV_INFO_PDB70、_IMAGE_DEBUG_DIRECTORY、IMAGE_DATA_DIRECTORY、IMAGE_FILE_HEADER、IMAGE_NT_HEADERS32、IMAGE_NT_HEADER64、IMAGE_OPTIONAL_HEADER32、IMAGE_OPTIONAL_HEADER64 结构。目标 PDB 文件的 Age、Guid、Version 就是通过这些结构找到的。

  2. DownloadLibrary.Classes.PdbParser 该类负责 PDB 解析。它实际上是我写的另一个项目的组成部分。PdbParser for C#,将在几周内发布。它支持解析和流分解 PDB70 版本 PDB 文件。它提取所有流,解析 PDB 头等。这是解析 SRCSRV 文件所必需的,该文件包含每个源代码文件的 URL 位置。

  3. DownloadLibrary.Classes.PdbExtractor 该类负责根据提供的 PdbFile 创建 SrvSrcFile,还负责从 Microsoft Reference Server 下载每个源文件并将其放置在正确的目录中。它为此使用了 PDBWebclientPdbParserScrSrvFile 类。

  4. DownloadLibrary.Classes.SrcSrvDownloadableFile,SrcSrvFile 这些类负责 SrcSrv 文件的解析、目标 URL 生成和目标路径生成。

  5. DownloadLibrary.Classes.Eula.PDBWebclient 这是一个派生自 System.Net.WebClient 的类,负责从 Microsoft Reference Server 下载内容、处理和存储 EULA 响应以及 EULA 检测。

历史

v1.3 此版本具有以下功能:

  • 允许递归处理子文件夹中的 DLL 或 EXE 文件(除了顶层目录)。
  • 允许清理临时压缩的 *.pd_ 文件。
  • 允许从 Microsoft 符号服务器 (msdl.microsoft.com) 下载本地 DLL 或 EXE 文件的零售符号(通过在 NetMassDownloader.exe.config 中将 UseReferenceSourceServer 设置为 "false")。
  • 使符号服务器的 URL 可在 NetMassDownloader.exe.config 中进行配置。
  • 允许通过在 NetMassDownloader.exe.config 中设置 DownloadSourceCode(默认为 "true")来指定是仅下载符号而不下载源代码。
  • 如果可用,则使用服务器上的原始文件日期-时间。
  • 下载现在是异步的;可以看到每个文件(符号或源代码)的下载进度。
  • 改进了控制台输出。输出不那么冗长,现在易于阅读。
  • 允许为现有符号文件恢复下载剩余的源代码文件(通过在 NetMassDownloader.exe.config 中将 SkipExistingSourceFiles 设置为 "true"(默认值))。

v1.2 添加了 -Proxy 配置开关,允许您为某些代理提供凭据。

v1.1 发布了一个 bug 修复版本,解决了某些代理未返回正确标头的问题。

© . All rights reserved.