才知道!
Scott Gu 抢先公布:
http://weblogs.asp.net/scottgu/archive/2008/01/16/net-framework-library-source-code-now-available.aspx
Shawn Burke给出详细配置步骤:
http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx
我为什么还在这里贴一遍自己的步骤, 我怕了! 自己动手验证之前网上的东西不能太轻信, 尽管作者很牛, 尽管有很多人叫好, 很多人顶, 顶, 顶! 试一遍往往会发现很多细节.
微软公开了.NET的一部分源码, 虽然不是全部, 但是目前公布的这些应该是份量最重也最有价值的部分. 摘一下
Scrott Gu 文章中列出来的部分:
- .NET Base Class Libraries
(including System, System.CodeDom, System.Collections,
System.ComponentModel, System.Diagnostics, System.Drawing,
System.Globalization, System.IO, System.Net, System.Reflection,
System.Runtime, System.Security, System.Text, System.Threading, etc).
- ASP.NET (System.Web, System.Web.Extensions)
- Windows Forms (System.Windows.Forms)
- Windows Presentation Foundation (System.Windows)
- ADO.NET and XML (System.Data and System.Xml)
上面这个分类列举有点乱, 第一项是按namespace来的, 后面的则既是 namespace又刚好对应到.NET framework library中的DLL文件不含.DLL扩展部分的名称.
下面是我根据 Shawn Burke给出的详细步骤的结果:
1. Tools->Options->Debugging
上面的这个选项我还从来没看过, 只改了上面红框中的两处, 第一个默认是勾上的, 第二个默认是没勾的. 第二个意思很明显, 第一项不清楚, 先有样学样.
上面的那个URL位置是:
保险起见, 指定的那个存放symbols的路径我已经手工创建好.
最下面的对话框是点击"Search the above locations..."之后弹出来的, 确定它. 关闭Option对话框.
2. 建一个简单的WinForm 程序, 在Load事件中改变 Text属性, 按
Shawn Burke的步骤做, 设断点停住, 然后下载符号文件
注意此时那个 Windows.Forms.dll 的符号还没有下载下来, 所以显示是灰色的. 点击"Load Symbols"菜单项之后会开始下载, 注意最下面的状态栏会显示, 上面的图是拼起来的, 状态栏显示的是System.Xml.dll
最下面是下载完第一个符号文件我有点不太相信, 在Total command里查看实际的磁盘文件. 网速太快了, 有点不太相信10M的东西一下子就完了.
看一个点击"Load Symbols"菜单项之后的license对话框, 确定它就是了:
这种东西从来是不假思索地同意.
3. 下载其它的符号
注意上面列出的 call stack 窗口中不会刚好把所有可以下载的符号文件罗列完全, 通过下面的Module窗口可以看到所有Load到当前进程的DLL:
点击这个菜单项会调出Modules窗口, 它竟然是跟普通.cs源文件一样在文档窗口中:
在这里可以通过右键菜单下载看到的这些dll对应的符号. 上面列出的有些是DLL是没有符号可下载的, 如果点击了下载, 会出来下面的文件对话框, 让你从自己磁盘上指定.pdb文件, 搞笑, 微软意思是说, 我服务器上的就不给你, 有本事你在自己硬盘上找出一个来吧.
取消.
4. Step into 微软的源码
符号文件归符号文件, 真正按F11跟踪进去时, 才去下载源代码. 用到一个源文件下载一个, 并不会一古脑全下载下来. 回头试试能不能通过直接copy来代替下载. 这样就可以脱机使用了. 小组内部安装也方便.
按F11 第一次跟踪进去时, 会弹出另一个license窗口, 是微软的只许看不许改协议:
全盘接受, 之后就看到了微软的 Form.cs源文件了:
不过这个属性的实现毫无新意, 直接转手交给了基类. 再跟进去:
Control基类里的实现就有点跟自己日常的代码不一样了, 首先这个Property带了一大堆Attribute, 其中有些东西在MSDN里是找不到的, 倒是验证了以前用reflector查看的代码中这些奇怪的Attribute不是空穴来风, 的确是微软写的.
跟第一次记录上面这些文字时相比, 现在再次参考它配置家里的机器, 发现symbol server必需设置一个
本地的目录, 并且位于最上面时, 才能真正利用上以前已经下载好的pdb文件, 否则还是会从微软网站上再下载一个, 比较慢, 慢的你会怀疑IDE死了.
我比较了一下, 同样是.NET 2.0中的System.Windows.Forms.pdb 文件, 其MD5 并不一样, 但却都能针对同一个System.Windows.Forms.dll 成功Load:
上面的Cache symbols from symbol servers to this directory
指定的目录作用不明确. 如果是从微软的服务器上下载的pdb, 并未保存在这个目录, 而是存在了
C:\Documents and Settings\zrf\System.Windows.Forms.pdb\3EEB25F167514FF69A150A53AFF8ED091\System.Windows.Forms.pdb
经实验, 原因竟然是 第一次指定的 E:\software\case\dotnet\.NET2.0_Src\ 末尾多包含了一个\,
这是从TotalCommander 中直接copy过来的, 这点小小的容错都没有, 唉. 不包含\之后, 微软下载到该目录下的pdb仍然是上面的格式:
System.Windows.Forms.pdb\3EEB25F167514FF69A150A53AFF8ED091\System.Windows.Forms.pdb
每个pdb都要建立一个子目录.
经实验, 直接把pdb文件放在这个目录下也是一样可以成功load的. 这样比较直观.
下面是从我自己指定的位置load, 也一样成功. 这说明DLL与PDB 文件不必是一一对应的关系.
阅读(1237) | 评论(0) | 转发(0) |