<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      袁創:使用反射動態調用ActiveX控件

      ■■■■前言

      目前的基于.NET平臺的軟件研發中仍然存在大量的對COMActiveX控件的調用。使用C#調用ActiveX控件時一般是使用vs.net工具自動生成的互操作性程序集。這種方法操作簡單,能保證一定的性能。但會產生額外的程序文件,不利于應用軟件的簡潔部署,還容易產生和ActiveX控件版本相關的錯誤。本文就提出使用反射技術動態調用ActiveX控件的方式來解決這些問題。

       

      ■■■■問題描述:

      目前的基于.NET平臺的軟件研發中仍然存在大量的對COMActiveX控件的調用。使用C#調用ActiveX控件時一般是使用vs.net工具的添加COM引用時自動生成的互操作性程序集。這種方法操作簡單,能保證一定的性能。但會產生額外的程序文件,不利于應用軟件的簡潔部署。而且當開發環境和運行環境使用的ActiveX控件的版本不一致[袁永福原創]時還容易出錯。

      筆者長期從事基于.NET平臺的通用產品類軟件研發。[袁永福原創]產品類軟件要求部署簡潔,為此筆者都會將多個工程編譯生成的多個.NET程序集文件合并成一個.NET程序集文件來做到簡潔部署。

      實踐中發現自動生成的互操作性程序集無法合并。另外產品類軟件應該能適應各種復雜的開發和生產環境,甚至ActiveX控件的CLSID 都有可能變化。

      例如,對于COM類庫“HebcaFormSealLib”,VS.NET會自動生成程序集文件“AxInterop.HebcaFormSealLib.dll”、“Interop.HebcaFormSealLib.dll”。這些程序集文件無法進行程序集合并,而且對于32位或64位的工程項目類型敏感,容易導致錯誤。

      ■■■■技術改進:

      因此筆者不采用這種自動生成的互操作性程序集。轉而采用自定義的反射來調用ActiveX控件。

      后期綁定ActiveX 控件主要知識點為System.Windows.Forms.AxHost類型和Type.InvokeMember方法。

      AxHost類型是從System.Windows.Forms.Control類型[袁永福原創]派生出來的,專門用于承載ActiveX控件。它是一個抽象類,有一個受保護的構造函數,函數參數是一個guid格式的ActiveX控件的CLSID字符串。還有一個GetOcx內部方法用于創建ActiveX控件的對象實例,它是一個COM對象引用。

      創建了這個COM對象引用后就可以調用Type.InvokerMember方法來動態的調用指定名稱的方法和屬性。

      ■■■■范例:

      筆者最近在使用某電子簽名的ActiveX控件來實現文檔簽名的功能。筆者寫出以下接口代碼

       
      [System.Runtime.InteropServices.ComVisible(false)]
      public class DCHebeiCAControl System.Windows.Forms.AxHost
      {
          public DCHebeiCAControl()
              base("{e4ee564c-0845-4404-91ee-0c206113333f}")
          }
          public object _ocx null;
          protected override void AttachInterfaces()
          {
              this._ocx base.GetOcx();
          }
          private void CheckOCX()
          {
              if (this._ocx == null)
              {
                  throw new System.NullReferenceException("_ocx");
              }
          }
          public VersionType GetBaseVersionType()
          {
              this.CheckOCX();
              VersionType result (VersionType)this._ocx.GetType().InvokeMember(
                  "GetBaseVersionType",
                  BindingFlags.InvokeMethod,
                  null,
                  this._ocx,
                  new object[});
              return result;
          }
          public string GetCert(string sealSN)
          {
              this.CheckOCX();
              string result (string)this._ocx.GetType().InvokeMember(
                  "GetCert",
                  BindingFlags.InvokeMethod,
                  null,
                  this._ocx,
                  new object[sealSN });
              return result;
          }
          public string GetClientDetailVersionInfo()
          {
              this.CheckOCX();
              string result (string)this._ocx.GetType().InvokeMember(
                  "GetClientDetailVersionInfo",
                  BindingFlags.InvokeMethod,
                  null,
                  this._ocx,
                  new object[});
              return result;
          }
          public int GetClientVersion()
          {
              this.CheckOCX();
              int result (int)this._ocx.GetType().InvokeMember(
                  "GetClientVersion",
                  BindingFlags.InvokeMethod,
                  null,
                  this._ocx,
                  new object[});
              return result;
          }
          public string GetClientVersionInfo()
          {
              this.CheckOCX();
              string result (string)this._ocx.GetType().InvokeMember(
                  "GetClientVersionInfo",
                  BindingFlags.InvokeMethod,
                  null,
                  this._ocx,
                  new object[});
              return result;
          }
          public object GetConfig(string argName)
          {
              this.CheckOCX();
              object result (object)this._ocx.GetType().InvokeMember(
                  "GetConfig",
                  BindingFlags.InvokeMethod,
                  null,
                  this._ocx,
                  new object[argName });
              return result;
          }
          // ----------- 口 -----------------------------
      }//classDCHebeiCAControl
       

       

      上述代碼中各個功能函數內部代碼結構簡單[袁永福原創],之間有很大的相似性,因此完全可以編寫一個代碼生成器來自動生成上述代碼。

      完成自定義的控件后,筆者再創建一個WinForm 窗體,在其Load事件中創建控件并添加到窗體上,其代碼如下

      這樣無需使用自動生成的COM接口程序集即可調用ActiveX控件,大幅提高程序 

      private DCHebeiCAControl _Control null;
      private void frmTest_Load(object senderEventArgs e)
      {
          this._Control new DCHebeiCAControl();
          this._Control.Size new Size(200200);
          this._Control.Location new Point(00);
          this.Controls.Add(this._Control);
      }
       

      的通用性,而且對于32位和64位的項目類型不敏感。方便部署和更新。

      不過這樣由于采用后期綁定而帶來一定的性能[袁永福原創]問題,因此對于性能敏感而又頻繁調用ActiveX控件的場景下需要謹慎采用這種模式。

       

      ■■■■小結:

      .net開發中調用舊的ActiveX控件是很多開發場景中不得不做的事情。在本文中,筆者介紹了在C#中調用ActiveX控件的標準模式,并提出了一種[袁永福原創]改良模式來提高程序的通用性。為操作ActiveX控件的.NET程序開發提供了一種新的技術手段。

      posted on 2018-03-06 11:28  袁永福 電子病歷,醫療信息化  閱讀(702)  評論(0)    收藏  舉報

      導航

      主站蜘蛛池模板: 色悠悠成人综合在线视频| 久久精品国产亚洲av麻| 国产又黄又硬又粗| 青青狠狠噜天天噜日日噜| 亚洲欧洲日产国码无码久久99| 各种少妇wbb撒尿| 三原县| 久9re热视频这里只有精品免费| 国产精品无遮挡又爽又黄| 国产成人a在线观看视频免费 | 在线无码中文字幕一区| 九九热免费在线播放视频| 欧美高清狂热视频60一70| 开心婷婷五月激情综合社区| 午夜A理论片在线播放| av午夜福利亚洲精品福利| 国产日韩精品一区在线不卡| 伊人色综合久久天天| 竹北市| 日韩有码中文字幕av| 性欧美乱熟妇xxxx白浆| 国产乱子伦农村xxxx| 亚洲天堂亚洲天堂亚洲色图| 亚洲午夜精品国产电影在线观看 | 洞头县| 国产伦精品一区二区亚洲| 久久99国产精品尤物| 清镇市| 国产一级片内射在线视频| 污污污污污污WWW网站免费| 中文字幕人妻在线精品| 最新精品国产自偷在自线| 亚洲国产日韩欧美一区二区三区| www亚洲精品| 国产精品自产在线观看一| 潮喷无码正在播放| 久久中文字幕国产精品| 国产一区二区在线有码| 陆河县| av新版天堂在线观看| 蜜桃草视频免费在线观看|