最近碰到开发者问:我使用 nuget 安装了 Senparc.Weixin SDK,但是有一些已经封装好的过程想要调试,我又不想直接附加源代码项目,这样就没有办法同步更新了,我应该怎么办?

  这其实是一个很常见也具有普遍代表性的问题,解决方案也是通用的,本文我们就来学习如何对已经安装了 dll 的项目的源代码进行断点调试。

一、配置

  第一步:打开 Visual Studio 2019(低版本操作应该也是类似的)

  第二步:点击顶部菜单【工具】>【选项...】

  第三步:在【选项】窗口中,左侧列表选择【调试】

  第四步:在右侧窗口中:

    • 取消选中【启用“仅我的代码”】
    • 取消选中【逐过程执行属性和运算符号(仅限托管)】
    • 取消选中【要求源文件与原始版本完全匹配】
    • 其他还有的选项根据自己实际需要修改

  以下是我的开发环境完成的配置:

  

  第五步:点击当前窗口左侧当前选中的【常规】下方的【符号】,选中右侧【NuGet.org 符号服务器】,再点击右上方【+】号,添加地址:https://nuget.smbsrc.net,并选中:

  这一步用于定义符号文件(即包含源代码调试定位信息的文件),以后每次调试,都会自动加载相关的文件,为了加快速度,我们可以原先进行缓存,点击下方【加载所有符号】按钮,然后等待缓存结束。

  注意:预先加载需要耗费比较多的时间(我重新测试了一次大概用了 20 分钟),但是为了减少后面的反复等待时间,这是值得的(缓存并不会占用太多硬盘空间,请放心加载)。如果程序集有比较大的变化,或者发生问题,也可以使用下方的按钮清空并重新加载。

  设置完成后点击【确定】按钮。

二、试验

  下面让我们以 Senparc.Weixin SDK 来测试一下,顺便学习一下如何创建新项目和安装 nuget 包。

  第一步:打开 Visual Studio 2019

  

  第二步,点击【创建新项目】,选择【ASP.NET Core Web 应用程序】(也可以选择 .NET Framework 项目):

  第三步:点击【下一步】,配置项目名称、路径等参数,如:

  第四步:点击【创建】,在项目模板中选择【Web 应用程序】(也可以选择其他站点模板,主要为了演示调试过程,所以不重要):

  第五步:点击【创建】,完成原始项目的创建:

  第六步:对项目标题点右键,选择【管理 Nuget 程序包...】

  第七步:在打打的窗口中,选择【浏览】标签,在搜索框内输入:Senparc.Weixin.MP,回车:

  请注意:盛派官方发布的库都带有“盛派”Logo的库,并请仔细核对全名,有些库是第三方开发者发布的。

  第八步:选中【Senparc.Weixin.MP】,在右侧点击【安装】按钮,如弹出确认框,点击【我接受】。稍等片刻即可安装完成(如果无法安装,请更改 nuget 源,具体方法不在本文展开):

  第九步:打开 startup.cs,在 ConfigureServices() 方法中,写入代码((.NET Framework 项目可打开 global.asax.cs,在 Application_Start() 方法中):

var nonceStr = Senparc.Weixin.MP.Helpers.JSSDKHelper.GetNoncestr();

  说明:我们可以调试任意地方的代码,写在 startup.cs 中只是为了当前演示断点可以尽快获得。

  此时,我们已经可以在非调试状态下查看反编译的源码(这一步不是接下去使用断点调试源码必须的,只作为可以扩展):把光标移到 GetNoncestr 方法名上,点击鼠标右键,点击【转到定义】(或直接按 F12),此时会显示提示框,点击【是】,即可看到 dll 中的源代码:

  注意:此源代码是从 dll 反编译过来的源代码,已经在编译过程中进行了优化,因此未必每个字符都 100% 和源代码一致,甚至部分局部变量会被重新命名,但是最终执行结果是一致的,也不会影响到调试。

  关闭反编译源码的窗口(必须)*,然后回到 startup.cs,我们给 GetToken() 语句打上断点:

  最后一步(第十步):点击菜单【调试】>【开始调试】(或直接按 F5)运行程序(注意:请保证当前的编译模式为 Debug):

  静静等待断点命中,在此过程中,VS 会自动载入一系列跟踪源码需要的文件,可能需要一段时间,这取决于依赖包的数量和当前的网速:

    稍等之后,即可命中语句:

  键盘点击 F11,就像你调试当前解决方案中的代码一样(如果提示是否允许从 github 下载源代码,点击同意):

  可以看到,现在 VS 打开了 github 上源代码的窗口,此时如果继续点击 F11,可以进入到此方法中调用的 Guid.NewGuid() 的 .net core 的相关方法:

  现在连续点击 F10,我们让程序继续执行,并在 startup.cs 中返回结果:

PS:

  * 之所以在调试源码之前必须要关闭反编译的窗口,是因为反编译的代码(包括代码位置、名称定义)和源码相比通常都会有出入,如果在调试的时候,打开着反编译代码窗口,VS 会优先进入到反编译窗口进行调试,但是调试定位是根据符号文件定义的,也就是说定位的源代码的原始位置,此时可能就会出现偏差。

列教程索引

地址:http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html

  1. Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册
  2. Senparc.Weixin.MP SDK 微信公众平台开发教程(二):成为开发者
  3. Senparc.Weixin.MP SDK 微信公众平台开发教程(三):微信公众平台开发验证
  4. Senparc.Weixin.MP SDK 微信公众平台开发教程(四):Hello World
  5. Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK
  6. Senparc.Weixin.MP SDK 微信公众平台开发教程(六):了解MessageHandler
  7. Senparc.Weixin.MP SDK 微信公众平台开发教程(七):解决用户上下文(Session)问题
  8. Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明
  9. Senparc.Weixin.MP SDK 微信公众平台开发教程(九):自定义菜单接口说明
  10. Senparc.Weixin.MP SDK 微信公众平台开发教程(十):多客服接口说明
  11. Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明
  12. Senparc.Weixin.MP SDK 微信公众平台开发教程(十二):OAuth2.0说明
  13. Senparc.Weixin.MP SDK 微信公众平台开发教程(十三):地图相关接口说明
  14. Senparc.Weixin.MP SDK 微信公众平台开发教程(十四):请求消息去重
  15. Senparc.Weixin.MP SDK 微信公众平台开发教程(十五):消息加密
  16. Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制
  17. Senparc.Weixin.MP SDK 微信公众平台开发教程(十七):个性化菜单接口说明
  18. Senparc.Weixin.MP SDK 微信公众平台开发教程(十八):Web代理功能
  19. Senparc.Weixin.MP SDK 微信公众平台开发教程(十九):MessageHandler 的未知类型消息处理
  20. Senparc.Weixin.MP SDK 微信公众平台开发教程(二十):使用菜单消息功能
  21. Senparc.Weixin.MP SDK 微信公众平台开发教程(二十一):在小程序中使用 WebSocket (.NET Core)
  22. Senparc.Weixin.MP SDK 微信公众平台开发教程(二十二):如何安装 Nuget(dll) 后使用项目源代码调试

Senparc.Weixin.MP SDK 微信公众平台开发教程(二十二):如何安装 Nuget(dll) 后使用项目源代码调试的更多相关文章

  1. Senparc.Weixin.MP SDK 微信公众平台开发教程(十二):OAuth2.0说明

    紧接上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明>,这里专讲OAuth2.0. 理解OAuth2.0 首先我们通过一张图片来了解一下OAu ...

  2. Senparc.Weixin.MP SDK 微信公众平台开发教程(十八):Web代理功能

    在Senparc.Weixin.dll v4.5.7版本开始,我们提供了Web代理功能,以方便在受限制的局域网内的应用可以顺利调用接口. 有关的修改都在Senparc.Weixin/Utilities ...

  3. Senparc.Weixin.MP SDK 微信公众平台开发教程(十):多客服接口说明

    微信官方的多客服接口原理是通过用户发送的信息,开发者服务器返回一条指定类型的响应信息,使用户的对话状态切换到官方的多客服状态(持续一段时间),这段时间内用户发送的所有信息都不会到达开发者的服务器,而是 ...

  4. Senparc.Weixin.MP SDK 微信公众平台开发教程(十四):请求消息去重

    为了确保信息请求消息的到达率,微信服务器在没有及时收到响应消息(ResponseMessage)的情况下,会多次发送同一条请求消息(RequestMessage),包括MsgId等在内的所有文本内容都 ...

  5. Senparc.Weixin.MP SDK 微信公众平台开发教程(十五):消息加密

    前不久,微信的企业号使用了强制的消息加密方式,随后公众号也加入了可选的消息加密选项.目前企业号和公众号的加密方式是一致的(格式会有少许差别). 加密设置 进入公众号后台的“开发者中心”,我们可以看到U ...

  6. Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制

    在<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>中,我介绍了获取AccessToken(通用接口)的方法. 在实际的开发过程中,所有的高级接口都需 ...

  7. Senparc.Weixin.MP SDK 微信公众平台开发教程(十九):MessageHandler 的未知类型消息处理

    这是<微信开发深度解析:微信公众号.小程序高效开发秘籍>出版之后写的第一篇微信相关的文章.从这一篇开始,将介绍第一版出版之后添加或修改的功能,或者对书上内容需要做的补充. MP v14.8 ...

  8. Senparc.Weixin.MP SDK 微信公众平台开发教程(十七):个性化菜单接口说明

    前不久微信上线了个性化菜单接口,Senparc.Weixin SDK也已经同步更新. 本次更新升级Senparc.Weixin.MP版本到v13.5.2,依赖Senparc.Weixin版本4.5.4 ...

  9. Senparc.Weixin.MP SDK 微信公众平台开发教程(三):微信公众平台开发验证

    要对接微信公众平台的"开发模式",即对接到自己的网站程序,必须在注册成功之后(见Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册),等待官方 ...

  10. Senparc.Weixin.MP SDK 微信公众平台开发教程(四):Hello World

    =============  以下写于2013-07-20 ============= 这一篇文章其实可以写在很前面,不过我还是希望开发者们尽多地了解清楚原理之后再下手. 通过上一篇Senparc.W ...

随机推荐

  1. Spring Cloud Gateway 服务网关快速上手

    Spring Cloud Gateway 服务网关 API 主流网关有NGINX.ZUUL.Spring Cloud Gateway.Linkerd等:Spring Cloud Gateway构建于 ...

  2. 史上最全面的SignalR系列教程-4、SignalR 自托管全解(使用Self-Host)-附各终端详细实例

    1.概述 通过前面几篇文章 史上最全面的SignalR系列教程-1.认识SignalR 史上最全面的SignalR系列教程-2.SignalR 实现推送功能-永久连接类实现方式 史上最全面的Signa ...

  3. html页面中关于按钮type的要求

    重要事项:如果在 HTML 表单中使用 button 元素,不同的浏览器会提交不同的值.Internet Explorer 将提交 <button> 与 </button> 之 ...

  4. Django上线部署之IIS

    环境: 1.Windows Server 2016 Datacenter 64位 2.SQL Server 2016 Enterprise 64位 3.Python 3.6.0 64位 4.admin ...

  5. 从零开始搭建前后端分离的NetCore(EF Core CodeFirst+Au)+Vue的项目框架之二autofac解耦

    在 上一篇 中将项目的基本骨架搭起来能正常跑通,这一篇将讲到,如何通过autofac将DbContext和model进行解耦,只用添加model,而不用在DbContext中添加DbSet. 在这里就 ...

  6. ionic 页面动画 ngAnimate

    git 地址: https://github.com/Augus/ngAnimate/ 使用方法: 下载后, 1.引入ngAnimate.js(依赖jquery); 2.引入 ng-animate.c ...

  7. PHP 递归读取无限级分类

    /** * [获取第一级分类] * 20170829 * * @return array */ public function getCateList(){ $this->catelog = [ ...

  8. 分布式任务调度框架 Azkaban —— Flow 1.0 的使用

    一.简介 Azkaban 主要通过界面上传配置文件来进行任务的调度.它有两个重要的概念: Job: 你需要执行的调度任务: Flow:一个获取多个 Job 及它们之间的依赖关系所组成的图表叫做 Flo ...

  9. Delphi - Windows系统下,Delphi调用API函数和7z.dll动态库,自动把文件压缩成.tar.gz格式的文件

    项目背景 应欧美客户需求,需要将文件压缩成.tar.gz格式的文件,并上传给客户端SFTP服务器. 你懂的,7-Zip软件的显著特点是文件越大压缩比越高,在Linux系统上相当于我们Windows系统 ...

  10. CAS及其ABA问题

    CAS.volatile是JUC包实现同步的基础.Synchronized下的偏向锁.轻量级锁的获取.释放,lock机制下锁的获取.释放,获取失败后线程的入队等操作都是CAS操作锁标志位.state. ...