一、前言

  .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后查看下包括的版本信息。

D:\Projects\AspNet\Mvc [master ≡]> git tag
1.0.
1.0.-rc2
1.0.
6.0.-alpha2
6.0.-alpha3
6.0.-alpha4
6.0.-beta1
6.0.-beta2
6.0.-beta3
6.0.-beta4
6.0.-beta5
6.0.-beta6
6.0.-beta7
6.0.-beta8
6.0.-rc1
rel/1.0.
D:\Projects\AspNet\Mvc [master ≡]>

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

  2.修改global.json

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

{
"projects": [ "src", "test", "D:\\Projects\\AspNet\\Mvc\\src" ],
"sdk": {
"version": "1.0.0-preview2-003131"
}
}

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

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

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

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

  将其修改为:

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

四、写在最后

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

GitHub:https://github.com/maxzhang1985/YOYOFx  如果觉还可以请Star下, 欢迎一起交流。

.NET Core 和 YOYOFx 的交流群: 214741894

如果你觉得本文对你有帮助,请点击“推荐”,谢谢.

  

  

Debugging into .NET Core源代码的两种方式的更多相关文章

  1. [转]Debugging into .NET Core源代码的两种方式

    本文转自:http://www.cnblogs.com/maxzhang1985/p/6015719.html 阅读目录 一.前言 二.符号服务器 三.项目中添加ASP.NET Core源代码 四.写 ...

  2. Java Core - 创建对象的两种方式

    一.通过new关键字创建对象 Hello hello = null;  //  声明一个引用 hello = new Hello();  //  创建对象 以上两行代码相当于 Hello hello ...

  3. Java学习-014-文本文件写入实例源代码(两种写入方式)

    此文源码主要为应用 Java 读取文本文件内容实例的源代码.若有不足之处,敬请大神指正,不胜感激! 第一种:文本文件写入,若文件存在则删除原文件,并重新创建文件.源代码如下所示: /** * @fun ...

  4. Java学习-013-文本文件读取实例源代码(两种数据返回格式)

    此文源码主要为应用 Java 读取文本文件内容实例的源代码.若有不足之处,敬请大神指正,不胜感激! 1.读取的文本文件内容以一维数组[LinkedList<String>]的形式返回,源代 ...

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

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

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

    背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,数据库使用达梦V8,CPU平台的范围包括x64.龙芯.飞腾.鲲鹏等.考虑到这些基础产品对.NET的支持,最终选择了.NET Core ...

  7. 在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入

    在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式 ...

  8. C#动态调用WCF接口,两种方式任你选。

    写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触到现在断断续续,真正使用的项目少之又少,更谈不上深入WCF内部实现机制和原理去研究,最近自己做一个项目时用到了WCF. 从这 ...

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

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

随机推荐

  1. SQL Server 求结果

    ;with cte as ( select  CONVERT(DATE, DATEADD(DAY, -9, GETDATE())) as paytime union all select datead ...

  2. 学习笔记:java线程安全

    首先得明白什么是线程安全: 线程安全是编程中的术语,指某个函数 (计算机科学).函数库在多线程环境中被调用时,能够正确地处理各个线程的局部变量,使程序功能正确完成. 这是维基百科里的资料,看完后还不是 ...

  3. Edge.js:让.NET和Node.js代码比翼齐飞

    通过Edge.js项目,你可以在一个进程中同时运行Node.js和.NET代码.在本文中,我将会论述这个项目背后的动机,并描述Edge.js提供的基本机制.随后将探讨一些Edge.js应用场景,它在这 ...

  4. Lesson 10 Not for jazz

    Text We have an old musical instrument. It is called a clavichord. It was made in Germany in 1681. O ...

  5. Python黑帽编程 3.3 MAC洪水攻击

    Python灰帽编程 3.3 MAC洪水 传统的交换机(我只对我目前使用的交互机做过测试,按照常识只能这样表述)在数据转发过程中依靠对CAM表的查询来确定正确的转发接口,一旦在查询过程中无法找到相关目 ...

  6. C#中使用Socket请求Web服务器过程

    最开始我们需要明白一件事情,因为这是这篇文章的前提: HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的.因此,浏览器访问Web服务器的过程必须先有“连接建立”的发生. 而有人或许会问: ...

  7. log4j.xml的实用例子

    大多数讲log4j配置的教程用的都是log4j.properties文件,我觉得xml或许更好一点,在这里我提供一个我已经用于生产环境的log4j.xml的例子,先上代码,然后再解释: <?xm ...

  8. 基于多线程的TCP服务器项目【开源】

    本文提供一个完整的TCP Server实例,包括动态连接库.单元测试.验收测试.Winform模拟测试.供新手学习,还望老手多提意见. 项目地址:https://tcpserversocket.cod ...

  9. 可扩容分布式session方案

    分布式session有以下几种方案: 1. 基于nfs(net filesystem)的session共享 将共享服务器目录mount各服务器的本地session目录,session读写受共享服务器i ...

  10. C语言 · 复习杂记

    /*=================================*/ /* 基础部分 */ /*=================================*/一:.CPP--C++文件: ...