• [连载]《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章 二次开发及应用》。

  • 相关阅读:
    maven加载jar包配置
    JavaScript基础博客
    angularjs1 实现地图添加自定义控件(搜索功能)及事件
    AngularJS之Directive,scope,$parse
    HTML5 File详解
    angularjs上传图片
    input上传按钮美化
    AngularJs表单验证
    作用域与闭包
    理解JavaScript中的作用域和上下文
  • 原文地址:https://www.cnblogs.com/lsjwq/p/5068168.html
Copyright © 2020-2023  润新知