[连载]《C#通讯(串口和网络)框架的设计与实现》- 11.调试器的设计
目 录
第十一章 调试器设计... 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)的操作,接口实现代码如下:
- /// <summary>
- /// 调试设备,传入IRunSCLDevice接口
- /// </summary>
- /// <param name="dev"></param>
- public void DebugDevice(IRunDevice dev)
- {
- this._DeviceController.AddDevice(dev);
- }
- /// <summary>
- /// 调试视图窗体,该窗体必须继承SuperIO.Show.IRTDataShow接口
- /// </summary>
- /// <param name="rtdataform"></param>
- public void DebugGraphicsShow(SuperIO.Show.IGraphicsShow show)
- {
- if (show is System.Windows.Forms.Form)
- {
- System.Windows.Forms.Form from = show as System.Windows.Forms.Form;
- from.MdiParent = this;
- from.Show();
- this._DeviceController.AddGraphicsShow(show);
- }
- else
- {
- MessageBox.Show("实现IGraphicsShow的同时,实例必须还得是Form类型");
- }
- }
- /// <summary>
- /// 调试导出数据接口,该类接口必须继承SuperIO.MiddleData.IExportData
- /// </summary>
- /// <param name="export"></param>
- public void DebugExportData(IExportData export)
- {
- this._DeviceController.AddExportData(new List<IExportData>(new IExportData[] { export }));
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="appService"></param>
- public void DebugAppService(IAppService appService)
- {
- if (appService.ServiceType == ServiceType.Show)
- {
- BarButtonItem bt = new BarButtonItem(this.barManager1, appService.ThisName);
- Font font = new Font("Tahoma", 12);
- bt.ItemAppearance.SetFont(font);
- bt.Tag = appService.ThisKey;
- bt.ItemClick += new ItemClickEventHandler(ServiceItem_ItemClick);
- barServices.AddItem(bt);
- }
- _DeviceController.AddAppService(new List<IAppService>(new IAppService[]{appService}));
- }
有界面方式的调试需要与配置文件进行交互,所以需要设置当前是否处于调试模式,可以通过SuperIO.Device.DebugDevice静态类的IsDebug属性进行标识。
建议使用这种方式对二次开发的组件进行调试。
11.3 命令行方式调试
也可以通过命令行的方式对二次开发的组件进行调试,实际上是SuperIO.Device.DebugDevice静态类用单例的模式创建了SuperIO.UI.MainForm窗体实例,并返回了IDebugDevice接口实例。简单的驱动和插件调试工作可以采用这种调试模式,快捷高效。代码定义如下:
- namespace SuperIO.Device
- {
- public class DebugDevice
- {
- private static object _LockObj = new object();
- private static SuperIO.Device.IDebugDevice _DebugInstance = null;
- /// <summary>
- /// 获得调试设备实例
- /// </summary>
- /// <returns></returns>
- public static SuperIO.Device.IDebugDevice GetDebugInstance()
- {
- if (_DebugInstance == null)
- {
- lock (_LockObj)
- {
- if (_DebugInstance == null)
- {
- _DebugInstance = (new SuperIO.UI.MainForm()) as SuperIO.Device.IDebugDevice;
- }
- }
- }
- return _DebugInstance;
- }
- private static bool _IsDebug = false;
- /// <summary>
- /// 是否是调试模式,如果是否不调用配制文件的信息
- /// </summary>
- public static bool IsDebug
- {
- get { return _IsDebug; }
- set { _IsDebug = value; }
- }
- }
- }
使用这种调试模式,不需要通过SuperIO.Device.DebugDevice. IsDebug属性设置为调试模式。
11.4 小结
任何组件的设计可能并不复杂,但是给工作带来很大方便。调试器更多的是一个概念,并没有太多的实际代码,但是在二次开发过程中确实方便了很多。
下一章介绍《第12章 二次开发及应用》。
[连载]《C#通讯(串口和网络)框架的设计与实现》- 11.调试器的设计的更多相关文章
- [连载]《C#通讯(串口和网络)框架的设计与实现》- 0.前言
目 录 前言 前言 刚参加工作,使用过VB.VC开发软件,随着C#的崛起,听说是C++++,公司决定以后开发软件使用C#,凭借在 ...
- 《连载 | 物联网框架ServerSuperIO教程》-4.如开发一套设备驱动,同时支持串口和网络通讯。附:将来支持Windows 10 IOT
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》-1.通讯框架介绍
[连载]<C#通讯(串口和网络)框架的设计与实现>- 0.前言 目 录 第一章 通讯框架介绍... 2 1.1 通讯的本质... 2 1 ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》- 6.通讯控制器的设计
目 录 第六章 通讯控制器的设计... 2 6.1 控制器接口... 2 6.2 串口控制器... 3 6.3 ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》-2.框架的总体设计
目 录 C#通讯(串口和网络)框架的设计与实现... 1 (SuperIO)- 框架的总体设计... 1 第二章 框架总体的设计... 2 2.1 ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》- 5.串口和网络统一IO设计
目 录 第五章 串口和网络统一IO设计... 2 5.1 统一IO接口... 2 5.1.1 串口IO.. 4 5.1.2 网络IO.. ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》-4.设备驱动管理器的设计
目 录 第四章 设备驱动管理器的设计... 2 4.1 接口定义... 2 4.2 设备容器... 7 4.3 ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》-3.设备驱动的设计
目 录 第三章 设备驱动的设计... 2 3.1 初始化设备... 4 3.2 运行设备接口设计... 4 3.3 ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》- 10.宿主程序详细设计
目 录 第十章 宿主程序详细设计... 2 10.1 配置文件设计... 3 10.2 加载设备驱动... 4 10.3 加载 ...
随机推荐
- trigger事件模拟
事件模拟trigger 在操作DOM元素中,大多数事件都是用户必须操作才会触发事件,但有时,需要模拟用户的操作,来达到效果. 需求:页面初始化时触发搜索事件并获取input控件值,并打印输出(效果图如 ...
- 嵌入式&iOS:回调函数(C)与block(OC)回调对比
学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...
- 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 ...
- [jquery]显示隐藏div标签的几种方法
1.$("#demo").attr("style","display:none;");//隐藏div $("#demo" ...
- Linux不能上网ping:unknown host问题怎么解决?
Linux不能上网提示ping:unknown host 检查步骤 Linux系统跟windows平台有所不同的是,为了更好的做网络服务应用.Linux下多用于网络服务器,而且操作界面是字符界面.对于 ...
- Xamarin.Android之ContentProvider
一.前言 掌握了如何使用SQLiteOpenHelper之后,我们就可以进行下一步的学习.本章我们将会学习如何使用ContentProvider来将数据库方面的操作封装起来,同时它还可以供其他应用访问 ...
- Entity Framework 6 Recipes 2nd Edition(13-10)译 -> 显式创建代理
问题 你有一个POCO实体,原本在执行一个查询时动态创建代理,现在你不想EF延迟创建代理带来的代价. 解决方案 假设你有一个如图Figure13-15的模型 Figure 13-15. A model ...
- 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)
在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...
- 设计模式之合成/聚合利用原则(CARP)
一.概念 CARP:CompositionAggregation Principle 合成聚合复用原则,尽量使用合成/聚合,尽量不使用类继承.合成聚合是“has a”的关系,而继承是“is a”的 ...
- SQL Server 在缺少文件组的情况下如何还原数据库
SQL Server 在缺少文件组的情况下如何还原数据库 一.背景 我有一个A库,由于a,b两张表的数据量比较大,所以对表进行分区:在把A库迁移到一个新的集群上去,我只备份了A库的主分区过去进行还原为 ...