一、前言

  .NET开源时间还不长,因为一直在做YOYOFx的关系,所似我常常有更深入的了解.NET Core和ASP.NET Core内容的需求,并且.NET Core平台与之前版本的变化太大,这也导致我经常要去查看源代码中,来了解ASP.NET Core和.NET Core代码实现。

  的确,.NET Core和ASP.NET Core的源代码,现在已经在Github上进行了代码托管;但不管是在Github上在线阅读或是将源代码Clone到本地阅读,都比较有局限性,我最想要的还是能通过调试的方法,单步的对程序进行DEBUG调试断点到源代码中。

  我写这篇文章的目地也是描述一下,如何调试.NET Core源代码的步骤,我总结了两种对.NET Core源代码的方法。

二、符号服务器

  以前微软给我们调试.NET程序的方法,通常是在Visual Studio加入符号服务器,来调试.NET托管程序。我们这次使用同样的方法,来完成这个调试源代码的任务。

  首先.NET Core的符号服务器地址:https://dotnet.myget.org/F/dotnet-core/symbols/ ,关于这个符号服务器地址是怎么找到的,还是去MyGet上去多溜溜,发现肯定会不少。

  我们这次使用Visual Studio 2015 Update3,来完成以下操作:

  1.设置符号服务器

  在VS2015的Tools -> Options -> Debugging ->Symbols中,添加符号服务器地址:https://dotnet.myget.org/F/dotnet-core/symbols/ ,然后最好清一下符号文件的缓存。

  2.设置VS2015支持调试进框架源代码

  Tools -> Options -> Debugging ->Symbols -> General中,勾选Enable .NET Framework source stepping和Enable source server support 两个选项。

  现在就可以进行单步调试进.NET Core的源代码中了,只是第一次DEBUG加载的时候,会非常的慢,符号服务器在国外嘛,真的是比较慢,而且不会一次性全部下载并加载进来,可能在调试到某些断点时,还要进行符号文件的下载,不过这种方法,也有好的一面,比如所有代码都能看到源代和调试了包括.NET Core的Fx。

三、项目中添加ASP.NET Core源代码

  第二种方式,是通过将源代码加入到项目中以达到代码调试的能力。这次以ASP.NET Core的源代码为例,同学们可以举一反三,这次使用的环境为.NET Core 1.0.1,当然ASP.NET Core MVC项目的版本也要与之对应。

  1.Clone源代码

  我们先Clone一份ASPNETCore.MVC的源代码到本地,因为我们这次使用的版本是1.0.1所以Clone后查看下包括的版本信息。

        
  1. D:\Projects\AspNet\Mvc [master ≡]> git tag

  2. 1.0.0

  3. 1.0.0-rc2

  4. 1.0.1

  5. 6.0.0-alpha2

  6. 6.0.0-alpha3

  7. 6.0.0-alpha4

  8. 6.0.0-beta1

  9. 6.0.0-beta2

  10. 6.0.0-beta3

  11. 6.0.0-beta4

  12. 6.0.0-beta5

  13. 6.0.0-beta6

  14. 6.0.0-beta7

  15. 6.0.0-beta8

  16. 6.0.0-rc1

  17. rel/1.0.1

  18. D:\Projects\AspNet\Mvc [master ≡]>

  我们需要的版本为rel/1.0.1,如果Clone的版本不正确也可以git checkout 1.0.1下。

  2.修改global.json

  接下来,我们要修改项目根目录中的global.json文件:

        
  1. {

  2. "projects": [ "src", "test", "D:\\Projects\\AspNet\\Mvc\\src" ],

  3. "sdk": {

  4. "version": "1.0.0-preview2-003131"

  5. }

  6. }

  在文件加入Clone下来的ASPNETCore源代码的路径。当然这里要注意,VS2015里创建项目模板可能会有版本问题,SDK使用的是1.0.0-preview2-003131版本,还有project.json里的程序集版本也要与源代码提供的版本保持一致!完成这个步骤后我们等待一会,整个项目就是重新来还原包信息和编译。

  当然还是会出现一些小问题,比如项目编译时会找不到AspNetCore项目编译出来的DLL文件,这是因为如果Clone下来的源代码与你的项目不在一个目录下的话,会导致找不到编译出来的程序集,解决方法也很简单,修改下编译参数,我的做法是修改.xproj的方法。

  将下载的ASP.NET Core的源代码中的项目文件 *.xproj 依次打开找到如下行:

        
  1. <OutputPath Condition="'$(OutputPath)'=='' ">..\..\artifacts\bin\</OutputPath>

  将其修改为:

        
  1. <OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>

四、写在最后

好了经过以上的步骤,现在再编译就可以通过了,接下来,下断点吧。 以上的两种方法都可以举一反三,找到符号文件或编译源代码加入项目目录,都可以编译调试任何.NET Core开源代码。

原文地址:http://www.cnblogs.com/maxzhang1985/p/6015719.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

Debugging into .NET Core源代码的两种方式相关推荐

  1. EntityFramework Core 2.0自定义标量函数两种方式

    前言 上一节我们讲完原始查询如何防止SQL注入问题同时并提供了几种方式.本节我们继续来讲讲EF Core 2.0中的新特性自定义标量函数. 自定义标量函数两种方式 在EF Core 2.0中我们可以将 ...

  2. 【Android】Android 彩信发送的两种方式+源代码

    Android  彩信发送的两种方式 第一种:直接调用彩信发送接口 实现代码如下, Intent intent = new Intent(Intent.ACTION_SEND); intent.add ...

  3. 国产化之 .NET Core 操作达梦数据库DM8的两种方式

    Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https ...

  4. Linux下编译、链接、加载运行C++ OpenCV的两种方式及常见问题的解决

    Linux下编译.链接.加载运行C++ OpenCV的两种方式及常见问题的解决 在Linux下安装完OpenCV C++之后(还没有安装的读者请参考Ubuntu 18.04 安装OpenCV C++) ...

  5. 钉钉扫码登录网站(两种方式实现)

    钉钉扫码登录网站(两种方式实现) 效果: 源代码地址:https://github.com/jellydong/DingQrCodeLogin 动手敲代码! 第一步,钉钉后台配置 参考链接:获取app ...

  6. android asynctask源码分析,Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)...

    本文实例讲述了Android通过Handler与AsyncTask两种方式动态更新ListView的方法.分享给大家供大家参考,具体如下: 有时候我们需要修改已经生成的列表,添加或者修改数据,noti ...

  7. VS Code - Debugger for Chrome调试JavaScript的两种方式

    VS Code - Debugger for Chrome调试JavaScript的两种方式 最近由于出差的缘故,博客写的不是很多,一直想写一篇VS Code - Debugger for Chrom ...

  8. Spring加载properties文件的两种方式

    2019独角兽企业重金招聘Python工程师标准>>> 在项目中如果有些参数经常需要修改,或者后期可能需要修改,那我们最好把这些参数放到properties文件中,源代码中读取pro ...

  9. 创建和应用Java包文件的两种方式

    <Java编程艺术>章节选登.作者:高永强 清华大学出版社 (即将出版) 12.1  包--package       包是Java提供的文件管理机制.包把功能相似的类,按照Java的名字 ...

最新文章

  1. 格式化json日期'/Date(-62135596800000)/'
  2. Jenkins使用遇到的问题总结
  3. 一. 视频信息与压缩编码
  4. Keil编译出现sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.报错的解决方法
  5. 好好学python · 内置函数(range(),zip(),sorted(),map(),reduce(),filter())
  6. java.lang.NoClassDefFoundError: javax/xml/bind/ValidationException
  7. Java HttpSessionListener监听器的使用
  8. MapReduce-流量统计求和-排序-Mapper和Reducer编写
  9. timerfd与epoll
  10. 搜索场景下的智能推荐演变之路
  11. Atitit .html5刮刮卡的gui实现总结
  12. IIS6上传文件尺寸太小解决办法
  13. FreeSWITCH之ESL接口
  14. 如何将PDF英文文档进行翻译?
  15. 多智能体强化学习——相关论文
  16. 对于因果模型的常见评估函数:SHD 和 FDR
  17. 深入理解Python中的if语句
  18. 1983—2001世嘉主机发展历程
  19. 计算机共享无法打印机共享的打印机,如果打印机共享无法打印,该怎么办,教您解决计算机打印机共享无法打印的问题...
  20. Elmedia Player Pro for Mac专业破解版永久激活方法

热门文章

  1. Shell练习题(持续更新)
  2. [BOOST] BOOST::Format
  3. windows7 + vs2008 + oracle + iis7 客户端配置成功
  4. Xamarin效果第十四篇之玩耍GIS
  5. EF Core 6 简化的数据库上下文注册
  6. 精简ABP的模块依赖
  7. NET问答: 枚举 和 常量 在使用时该怎么抉择?
  8. 谈谈低代码趋势和开发人员的未来
  9. 使用 Tye 辅助开发 k8s 应用竟如此简单(五)
  10. 你有把依赖注入玩坏?