目       录

第十一章     调试器设计... 2

11.1         调试接口... 2

11.2         界面方式调试... 3

11.3         命令行方式调试... 5

11.4         小结... 6

第十一章      调试器设计

SuperIO 框架平台设计、开发完毕后,想把代码编译成程序集(DLL),二次开发都通过引用DLL实现接口、继承类库来实现驱动和插件的开发,SuperIO框架的代码不会轻易去改变。这是框架设计最终要达到的效果,但是在二次开发过程中还是很不方便,主要涉及到两方面的问题:1.开发好驱动后,如何验证驱动的最终效果?例如:原始数据的解析、数据的处理流程和功能的实现等等,所以要在Debug模式下能够调试驱动的源代码,而不是调试SuperIO本身的代码。不可能把开发好驱动反复挂载到配置文件中,反复启动软件来验证驱动开发的效果,那将是耗时耗力的一件事。2.在Debug模式下,也就是在调试过程中,SuperIO框架是要有选择性的与配置文件信息进行交互,尽管只是调试驱动模块的源代码,但是整个框架平台是处于调试模式,例如:在调试模式下,不加载配制文件中驱动;在调试模式下,不把设备驱动的信息写到配制文件中等等。

基于现实应用情况,在框架平台中增加了调试器的功能。这块代码的实现并不复杂,但是在框架平台的体系中是必要的一部分。就像人缺少了一部分后,总显得不那么完美。

11.1     调试接口

IDebugDevice接口定义了4个调试接口函数,主要用于对设备驱动、界面视图、数据导出和服务组件进行源代码调试。接口定义如下图:

11.2     界面方式调试

二次开发者可以继承SuperIO.UI.MainForm窗体类来创建自己的宿主程序,可以在此基础上进行扩展。SuperIO.UI.MainForm类本身继承了IDebugDevice接口,并实现了每个调试接口。实现调试接口,本质上是对控制器(SuperIO.DeviceController)的操作,接口实现代码如下:

  1. /// <summary>
  2. /// 调试设备,传入IRunSCLDevice接口
  3. /// </summary>
  4. /// <param name="dev"></param>
  5. public void DebugDevice(IRunDevice dev)
  6. {
  7. this._DeviceController.AddDevice(dev);
  8. }
  9.  
  10. /// <summary>
  11. /// 调试视图窗体,该窗体必须继承SuperIO.Show.IRTDataShow接口
  12. /// </summary>
  13. /// <param name="rtdataform"></param>
  14. public void DebugGraphicsShow(SuperIO.Show.IGraphicsShow show)
  15. {
  16. if (show is System.Windows.Forms.Form)
  17. {
  18. System.Windows.Forms.Form from = show as System.Windows.Forms.Form;
  19. from.MdiParent = this;
  20. from.Show();
  21. this._DeviceController.AddGraphicsShow(show);
  22. }
  23. else
  24. {
  25. MessageBox.Show("实现IGraphicsShow的同时,实例必须还得是Form类型");
  26. }
  27. }
  28.  
  29. /// <summary>
  30. /// 调试导出数据接口,该类接口必须继承SuperIO.MiddleData.IExportData
  31. /// </summary>
  32. /// <param name="export"></param>
  33. public void DebugExportData(IExportData export)
  34. {
  35. this._DeviceController.AddExportData(new List<IExportData>(new IExportData[] { export }));
  36. }
  37.  
  38. /// <summary>
  39. ///
  40. /// </summary>
  41. /// <param name="appService"></param>
  42. public void DebugAppService(IAppService appService)
  43. {
  44. if (appService.ServiceType == ServiceType.Show)
  45. {
  46. BarButtonItem bt = new BarButtonItem(this.barManager1, appService.ThisName);
  47. Font font = new Font("Tahoma", 12);
  48. bt.ItemAppearance.SetFont(font);
  49. bt.Tag = appService.ThisKey;
  50. bt.ItemClick += new ItemClickEventHandler(ServiceItem_ItemClick);
  51. barServices.AddItem(bt);
  52. }
  53. _DeviceController.AddAppService(new List<IAppService>(new IAppService[]{appService}));
  54.  
  55. }

有界面方式的调试需要与配置文件进行交互,所以需要设置当前是否处于调试模式,可以通过SuperIO.Device.DebugDevice静态类的IsDebug属性进行标识。

建议使用这种方式对二次开发的组件进行调试。

11.3     命令行方式调试

也可以通过命令行的方式对二次开发的组件进行调试,实际上是SuperIO.Device.DebugDevice静态类用单例的模式创建了SuperIO.UI.MainForm窗体实例,并返回了IDebugDevice接口实例。简单的驱动和插件调试工作可以采用这种调试模式,快捷高效。代码定义如下:

  1. namespace SuperIO.Device
  2. {
  3. public class DebugDevice
  4. {
  5. private static object _LockObj = new object();
  6. private static SuperIO.Device.IDebugDevice _DebugInstance = null;
  7. /// <summary>
  8. /// 获得调试设备实例
  9. /// </summary>
  10. /// <returns></returns>
  11. public static SuperIO.Device.IDebugDevice GetDebugInstance()
  12. {
  13. if (_DebugInstance == null)
  14. {
  15. lock (_LockObj)
  16. {
  17. if (_DebugInstance == null)
  18. {
  19. _DebugInstance = (new SuperIO.UI.MainForm()) as SuperIO.Device.IDebugDevice;
  20. }
  21. }
  22. }
  23. return _DebugInstance;
  24. }
  25.  
  26. private static bool _IsDebug = false;
  27. /// <summary>
  28. /// 是否是调试模式,如果是否不调用配制文件的信息
  29. /// </summary>
  30. public static bool IsDebug
  31. {
  32. get { return _IsDebug; }
  33. set { _IsDebug = value; }
  34. }
  35. }
  36. }

使用这种调试模式,不需要通过SuperIO.Device.DebugDevice. IsDebug属性设置为调试模式。

11.4     小结

任何组件的设计可能并不复杂,但是给工作带来很大方便。调试器更多的是一个概念,并没有太多的实际代码,但是在二次开发过程中确实方便了很多。

下一章介绍《第12章 二次开发及应用》。

[连载]《C#通讯(串口和网络)框架的设计与实现》- 11.调试器的设计的更多相关文章

  1. [连载]《C#通讯(串口和网络)框架的设计与实现》- 0.前言

                                  目       录 前言 前言 刚参加工作,使用过VB.VC开发软件,随着C#的崛起,听说是C++++,公司决定以后开发软件使用C#,凭借在 ...

  2. 《连载 | 物联网框架ServerSuperIO教程》-4.如开发一套设备驱动,同时支持串口和网络通讯。附:将来支持Windows 10 IOT

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  3. [连载]《C#通讯(串口和网络)框架的设计与实现》-1.通讯框架介绍

    [连载]<C#通讯(串口和网络)框架的设计与实现>- 0.前言 目       录 第一章           通讯框架介绍... 2 1.1           通讯的本质... 2 1 ...

  4. [连载]《C#通讯(串口和网络)框架的设计与实现》- 6.通讯控制器的设计

    目       录 第六章           通讯控制器的设计... 2 6.1           控制器接口... 2 6.2           串口控制器... 3 6.3          ...

  5. [连载]《C#通讯(串口和网络)框架的设计与实现》-2.框架的总体设计

    目       录 C#通讯(串口和网络)框架的设计与实现... 1 (SuperIO)- 框架的总体设计... 1 第二章           框架总体的设计... 2 2.1           ...

  6. [连载]《C#通讯(串口和网络)框架的设计与实现》- 5.串口和网络统一IO设计

    目       录 第五章           串口和网络统一IO设计... 2 5.1           统一IO接口... 2 5.1.1    串口IO.. 4 5.1.2    网络IO.. ...

  7. [连载]《C#通讯(串口和网络)框架的设计与实现》-4.设备驱动管理器的设计

    目       录 第四章           设备驱动管理器的设计... 2 4.1           接口定义... 2 4.2           设备容器... 7 4.3          ...

  8. [连载]《C#通讯(串口和网络)框架的设计与实现》-3.设备驱动的设计

    目       录 第三章           设备驱动的设计... 2 3.1           初始化设备... 4 3.2           运行设备接口设计... 4 3.3        ...

  9. [连载]《C#通讯(串口和网络)框架的设计与实现》- 10.宿主程序详细设计

    目       录 第十章           宿主程序详细设计... 2 10.1        配置文件设计... 3 10.2        加载设备驱动... 4 10.3        加载 ...

随机推荐

  1. trigger事件模拟

    事件模拟trigger 在操作DOM元素中,大多数事件都是用户必须操作才会触发事件,但有时,需要模拟用户的操作,来达到效果. 需求:页面初始化时触发搜索事件并获取input控件值,并打印输出(效果图如 ...

  2. 嵌入式&iOS:回调函数(C)与block(OC)回调对比

    学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...

  3. mysql-5.6.34 Installation from Source code

    Took me a while to suffer from the first successful souce code installation of mysql-5.6.34. Just pu ...

  4. [jquery]显示隐藏div标签的几种方法

    1.$("#demo").attr("style","display:none;");//隐藏div $("#demo" ...

  5. Linux不能上网ping:unknown host问题怎么解决?

    Linux不能上网提示ping:unknown host 检查步骤 Linux系统跟windows平台有所不同的是,为了更好的做网络服务应用.Linux下多用于网络服务器,而且操作界面是字符界面.对于 ...

  6. Xamarin.Android之ContentProvider

    一.前言 掌握了如何使用SQLiteOpenHelper之后,我们就可以进行下一步的学习.本章我们将会学习如何使用ContentProvider来将数据库方面的操作封装起来,同时它还可以供其他应用访问 ...

  7. Entity Framework 6 Recipes 2nd Edition(13-10)译 -> 显式创建代理

    问题 你有一个POCO实体,原本在执行一个查询时动态创建代理,现在你不想EF延迟创建代理带来的代价. 解决方案 假设你有一个如图Figure13-15的模型 Figure 13-15. A model ...

  8. 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)

    在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...

  9. 设计模式之合成/聚合利用原则(CARP)

    一.概念 CARP:CompositionAggregation Principle 合成聚合复用原则,尽量使用合成/聚合,尽量不使用类继承.合成聚合是“has  a”的关系,而继承是“is  a”的 ...

  10. SQL Server 在缺少文件组的情况下如何还原数据库

    SQL Server 在缺少文件组的情况下如何还原数据库 一.背景 我有一个A库,由于a,b两张表的数据量比较大,所以对表进行分区:在把A库迁移到一个新的集群上去,我只备份了A库的主分区过去进行还原为 ...