自动下载完整的.NET源代码

豆豆网   技术应用频道   2008年01月24日  【字号: 收藏本文

本文详细介绍自动下载完整的.NET源代码

  从去年MS就开始喊着要开放.NET源代码,如今终于在一个含糊不清的授权协议下,通过Source Server的方式放了出来。虽然是如愿开源,但目前只提供几个核心模块,而且还限制必须在VS2008里面在线访问。

  其实既然决定开放,何必搞那么多限制出来,让偶等用着不爽还得自己动手丰衣足食,写个程序直接模拟VS2008获取源码的行为,一次性全部拖回来备用。

  空口无凭,上载一个 System.Xml 的源码包,和一个理论上能跑的程序原型,有兴趣的朋友可以试试。回头有时间了把相关代码整理一下再放出来,下面先大概说一下思路。

  首先,VS2008虽然要打个补丁才能用源码调试,但这并不是下载源码的必要条件。MS发布源码所依赖的Source Server的机制,很早就通过 WinDbg 的发布包引入了。有兴趣的朋友可以使用 WinDbg 工具自己架设 Source Server,具体步骤请参考 %Debugging Tools for Windows%sdksrcsrv 目录下文档和脚本。

  而这个 Source Server 说白就是从 .pdb 调试符号文件里面,获取被绑定的已索引文件列表,然后根据系统_NT_SOURCE_PATH环境变量指定的服务器,拼接出一个 URL 然后通过http下载。具体这块的配置,可以参考

  Configuring Visual Studio to Debug .NET Framework Source Code

  讨厌的是MS在dbghelp.dll里面做了一些手脚,直接通过url去下载调试符号和源码是不被允许的。刚好scz前面研究过symbol server的行为,基本确定ms服务端是根据user agent来进行判断的。也就是说在发起请求时,把当前http的user agent改成ms认可的方式,就能够模拟dbghelp.dll通过srcsrv.dll完成的工作,具体代码类似

public const string DefaultUserAgent = "Microsoft-Symbol-Server/9.9.9.9 (C; V; ;)";
  
  public void Restart(Uri uri)
  {
   _request = (HttpWebRequest)WebRequest.Create(uri);
   _request.UserAgent = DefaultUserAgent;  
  
   IAsyncResult result = (IAsyncResult)_request.BeginGetResponse(
    new AsyncCallback(ResponseCallback), this);
   ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle,
    new WaitOrTimerCallback(TimeoutCallback), this, _timeout, true);   
  }

责编:豆豆技术应用

正在加载评论...