程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> [連載]《C#通訊(串口和網絡)框架的設計與實現》- 11.調試器的設計,

[連載]《C#通訊(串口和網絡)框架的設計與實現》- 11.調試器的設計,

編輯:C#入門知識

[連載]《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章 二次開發及應用》。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved