採用C 反射機制和動態引數實現可外掛程式業務平台

2021-05-22 00:04:11 字數 1838 閱讀 5383

1 引言

在資訊系統開發,使用者業務功能變化預先不可知,故要提高系統後期的業務擴充套件。一般情況下使用者需求發生變化,要重新編寫**,編譯,生產部署包,然後再更新使用者程式。這樣的過程比較繁瑣。

本文討論生成後的應用系統與外部編譯的業務庫實現動態繫結,應用程式在執行過程中動態繫結要實現的外部業務,當業務發生變化,也只是替換這些外部的動態庫,不用重新對應用程式進行修改和編譯,實現了耦合繫結。同時,業務例項物件可以在程式執行時實現例項化,達到了封裝效果。並且降低了呼叫**和具體實現類**的耦合,增強靈活性和可復用性,增加了軟體的可維護性。

c#提供的反射機制,再結合自適應資料引數的傳遞,通過這個技術,我們可以將應用框架中的擴充套件點以外掛程式式程式集的方式來動態載入、構建,從而實現可動態擴充套件的應用程式。

2 反射機制的基礎知識

反射[1][2]是.net中重要機制,通過反射,可以在執行時獲得.net中每乙個型別(包括類、結構、委託、介面和列舉等)的成員,包括方法、屬性、事件,以及建構函式等。還可以獲得每個成員的名稱、限定符和引數等。.net的應用程式結構分為應用程式域、程式集、模組、型別和成員幾個層次,公共語言執行庫載入器管理應用程式域,這種管理包括將每個程式集載入到相應的應用程式域以及控制每個程式集中型別層次結構的記憶體布局。程式集包含模組,而模組包含型別,型別又包含成員,反射則提供了封裝程式集、模組和型別的物件。我們可以使用反射動態地建立型別的例項,將型別繫結到現有物件或從現有物件中獲取型別,然後呼叫型別的方法或訪問其字段和屬性。

反射通常具有以下用途:① 使用assembly定義和引導程式集,載入在程式集清單中列出的模組,以及從此程式集中查詢型別並建立該型別的例項;② 使用module了解如下的類似資訊,如模組的程式集以及模組中的類等:③ 使用coustructorinfo了解如下的類似資訊,如建構函式的名稱、引數、訪問修飾符(如public或private)和實現詳細資訊(如abstract或virtua1)等;④ 使用methodinfo來了解如下的類似資訊,如方法的名稱、返回型別、引數、訪問修飾符(如public或private)和實現詳細資訊(如abstract或virtua1)等;⑤ 使用fieldinfo來了解如下的類似資訊,如字段的名稱、訪問修飾符(如public或private)和實現詳細資訊(如static)等,並獲取或設定字段值;⑥ 使用eventinfo來了解如下的類似資訊,如事件的名稱、事件處理程式資料型別、自定義屬性、宣告型別和反射型別等,並新增或移除事件處理程式:⑦ 使用propertyinfo來了解如下的類似資訊,如屬性的名稱、資料型別、宣告型別、反射型別和唯讀或可寫狀態等,並獲取或設定屬性值;⑧ 使用parameterinfo來了解如下的類似資訊,如引數的名稱、資料型別、引數是輸入引數還是輸出引數,以及引數在方法簽名中的位置等。

3.總體設計思路

外掛程式是一種遵循一定規範的應用程式介面編寫出來的程式模組。當應用程式已經部署,但業務發生了變化,這樣可以通過讀取外掛程式配置資訊,載入新的應用構件,實現變化的業務。

對於應用系統的框架而言,擴充套件點是框架中預先定義的一些「點」。 在框架復用中應用構件的組裝需要基於擴充套件點進行。構造性和演化性是軟體的兩個本質特徵,作為一類重要的可復用軟體製品。而基於擴充套件點可以組裝不同的應用構件以適應領域的變化性。則體現了框架對於軟體演化特徵的支援[3]。

本文涉及到幾個概念,外掛程式配置定義,介面定義,方法定義和呼叫引數定義和返回引數定義。在本外掛程式平台中,配置檔案描述外掛程式配置定義,介面定義,方法定義。對於呼叫引數定義和返回引數定義則採用通用物件和動態物件組[4]來實現傳入和返回引數。

外掛程式平台的實現過程如圖1所示。當平台執行初始化時,通過讀取xml配置資訊,裝載dll,通過c#的反射機制分析dll裡的全部實現類和方法。外部構件可以在平台容器中被例項化,並執行外掛程式點的方法。實現的演算法不再是編碼硬繫結。

c 實現反射機制

c 中反射機制比較常見,而c 中沒有該機制。使用c 實現反射機制,主要利用了工廠模式程序物件的生產。itest.h 基類test.h 繼承類helper.h 幫助類main.cpp 主函式入口檔案 pragma once include using namespace std class itest...

c so 反射 C 實現反射機制

net下的很多技術都是基於反射機制來實現的,反射讓.net平台下的語言變得得心應手。最簡單的,比如列舉型別,我們我可以很容易的獲得乙個列舉變數的數值以及其名稱字串。可是,在c 中,列舉變數本質上和乙個整形變數沒有區別,我們很難獲取乙個列舉變數的名稱字串。其實在c 中,我們可以通過巨集來實現類似反射的...

c so 反射 c 實現反射機制

下午接了個阿里 面試,當時剛剛睡醒,感覺有點懵。大腦莫名當機狀態,很多問題沒有表述清楚,有乙個關於 c 如何實現反射機制的問題,感覺蠻有意思,當時雖然回答了用函式指標和工廠模式,但是表述並不當,細節也沒有想清楚。晚上抽空簡單實現了一發 file name reflector.cpp author x...