1. 程式人生 > 其它 >這可能是最完美的K3Cloud外掛熱更新方案了...

這可能是最完美的K3Cloud外掛熱更新方案了...

前言

眾所周知,金蝶K3Cloud的外掛更新後是要重啟IIS的。重啟後系統還比較卡,而且要重新登入啥的,非常麻煩。目前也有不少熱更新的方案,早期我也做過反射熱更新的,但始終有點不方便(詳見方案說明),之前翻翻金蝶的介面,發現了有方法可以修改執行時的原資料,所以有了本文。

現有方案

反射、MEF等方法

  • 說明
    本人做過反射方法,也發現有人用過MEF實現的熱更新。本質是寫個標準金蝶金蝶外掛,通過載入實際外掛,並轉發事件達成熱更新的效果。

  • 優點
    沒什麼特殊的優點...

  • 缺點
    BOS IDE需要掛個假外掛,實際釋出的時候又要取消掉再掛上正式的外掛,很麻煩。

金蝶標準方案

  • 說明
    金蝶自帶方案本應是最完美的方案,畢竟可以修改原始碼,按道理說根本沒第三方方案的事。然而給你機會你不中用啊...

  • 優點
    無侵入性,BOS IDE無需任何額外配置。不需要釋出時候做特殊處理。

  • 缺點
    本人以v7.6版本親測(其他版本不好說),不好用...

    1. 穩定性太差。測試時發現,只有第一次更改外掛會熱更新,第二次以後均無效果...(這個我也見過有人說過,應該不只我一個人遇到)

    2. 無法除錯。這是最致命的問題。熱更新的後的dll沒辦法除錯,我推測可能跟其了更是實現的方法有關,它是複製dll到另外目錄實現熱更新,具體沒仔細研究。

    3. 表單需關閉重開才能實現熱更新

本方案特點

  1. 無侵入性:不會永久修改元資料。無需做任何特殊即可實現熱更新,否則總會有失誤忘記修改的時候。
  2. 自動禁用BOS外掛:當要熱更新的外掛已經在BOS IDE配置時,正常熱更新外掛會觸發一次,BOS IDE配置的外掛也會觸發一次,導致外掛重複執行。所以,本方案執行時,如果BOS IDE已配置相同外掛,則BOS IDE配置的外掛會被自動禁用。
  3. 即時熱更新 :不需要關閉單據重新開啟也能熱更新。
  4. 可除錯:這很重要,除錯不了難道靠ShowMessage彈窗除錯嗎。
  5. 統一檔案配置,方便管理

使用方法(使用工具)

  • 下載K3CloudDevTools。地址:http://123.57.89.55:996/Home/Download
  • 點選選單“外掛熱更新”,顯示熱更新介面
  • 維護好金蝶Bin目錄
  • 點選“新增”,選擇表單ID
  • 在對應的外掛欄目輸入真實的外掛類名(格式:完整名稱空間.類名,dll檔名),多個外掛用回車隔開
  • 操作外掛比較特殊,需維護:操作程式碼=外掛內碼,如果一個操作程式碼有多個外掛,則維護多行
  • 儲存,點選“安裝”,根據實際情況選擇是否重啟IIS或者清除快取(詳見:需重啟情況說明)
  • 不需要此功能可以點選解除安裝,會對安裝時進行的所以操作進行反操作。

使用方法(手工)

  • 下載工具,從裡面複製出檔案:K3CloudDevTools.HotPlugin.dll,複製到金蝶WebSite的bin目錄
  • 在Bin目錄新建SuyanaHotPlugin.json檔案(檔名必須叫這名字),按以下格式維護資料:
  • 執行SQL
INSERT INTO T_META_FORMMETASERVICEPLUGIN (FID,FOBJECTID,FCLASSNAME,FSEQ) 
VALUES (???,表單標識,'K3CloudDevTools.HotPlugin.AbstractDynamicFormMetaServiceProxyPlugIn,K3CloudDevTools.HotPlugin',999)
  • 首次安裝或新增新表單id時需重啟

需重啟情況說明

本方案在特定情況下需要重啟的

  1. 首次安裝(從未使用本方案或解除安裝後再次安裝都視為首次安裝)
  2. 新增的業務物件新增外掛(這個有辦法可以不重啟,先不弄了,目前需要重啟)

以下情況可以通過清除K3Cloud快取而不需要重啟(但表單需關閉重開)

  1. 為已有表單新增其他外掛
  2. 啟用或禁用

清除快取方法:金蝶K3Cloud搜尋“快取”,在出來的視窗全選,點“清除”

操作演示

業務物件:動態表單,按鈕Key:FButton1,新增外掛,當按鈕點選時,彈出固定文字和記錄執行時間
測試目的:即時更新、BOS IDE自動禁用同名外掛測試、支援除錯。
真實外掛程式碼:

using System;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Util;
namespace HotPluginTest.BusinessPlugIn {
    public class DynamicFormTest: AbstractDynamicFormPlugIn {
        public override void ButtonClick(ButtonClickEventArgs e) {
            base.ButtonClick(e);
            if (e.Key.EqualsIgnoreCase("FButton1")) {
                View.ShowErrMessage("333333");

                //記錄執行日誌,用於查詢外掛是否與BOS所掛外掛重複執行,請檢視Bin目錄的!HotPluginLog.log檔案檢視輸出日誌
                var guid = Guid.NewGuid().ToString();
                var dt = DateTime.Now.ToString();
                K3CloudSimpleLogger.Default.Log($"DynamicFormTest-ButtonClick-FButton1 外掛已運行於:{dt} {guid}");
            }
        }
    }
}

BOS IDE外掛配置:

測試截圖:

日誌:

日誌說明

本操作會在bin目錄生成檔名為:!HotPluginLog.log的日誌檔案,如有問題可以檢視日期排查原因。

其他說明

  • 只建議在測試環境使用,不要為了方便在正式環境使用,可能會有不可預料的效能或其他問題

  • 本方案需同時滿足3個條件方能執行:資料庫記錄+配置檔案+dll。正式環境只要不滿足這3個條件的任何一個就不會影響到正式環境,無需擔心

  • 目前不支援單據轉換外掛,沒寫過這外掛...

  • 部分外掛操作(特別是彈窗)可能因為本身存在快取導致外掛雖然熱更新了,但顯示不會變化。此非熱更新問題,除錯是有執行的。已知的有BeforeF7Select,例如修改:e.DynamicFormShowParameter.MultiSelect,在彈出視窗後再改程式碼,雖然熱更新了,但介面不會變化,這種需關閉表單重新開啟才會有效果。