K3CloudDevTools【插件热更新】
特别声明
之所以会有这篇文章,是因为本人在使用过程中发现,金蝶自带的热更新不好用(具体下面有描述),但是和个别QQ好友沟通时发现,他们的热更新并没有问题。所以本文只适合金蝶自带热更新有异常想换掉的同学,其他的直接右上角关掉…
前言
众所周知,金蝶K3Cloud的插件更新后是要重启IIS的。重启后系统还比较卡,而且要重新登录啥的,非常麻烦。目前也有不少热更新的方案,早期我也做过反射热更新的,但始终有点不方便(详见方案说明),之前翻翻金蝶的接口,发现了有方法可以修改运行时的原数据,所以有了本文。
现有方案反射、MEF等方法
说明本人做过反射方法,也发现有人用过MEF实现的热更新。本质是写个标准金蝶金蝶插件,通过加载实际插件,并转发事件达成热更新的效果。
优点没什么特殊的优点…
缺点BOS IDE需要挂个假插件,实际发布的时候又要取消掉再挂上正式的插件,很麻烦。
金蝶标准方案
说明金蝶自带方案本应是最完美的方案,毕竟可以修改原代码,按道理说根本没第三方方案的事。然而给你机会你不中用啊…
优点无侵入性,BOS IDE无需任何额外配置。不需要发布时候做特殊处理。
缺点本人以v7.6版本亲测(其他版本不好说),不好用…
稳定性太差。测试时发现,只有第一次更改插件会热更新,第二次以后均无效果…(这个我也见过有人说过,应该不只我一个人遇到)
无法调试。这是最致命的问题。热更新的后的dll没办法调试,我推测可能跟其了更是实现的方法有关,它是复制dll到另外目录实现热更新,具体没仔细研究。
表单需关闭重开才能实现热更新
本方案特点无侵入性:不会永久修改元数据。无需做任何特殊即可实现热更新,否则总会有失误忘记修改的时候。自动禁用BOS插件:当要热更新的插件已经在BOS IDE配置时,正常热更新插件会触发一次,BOS IDE配置的插件也会触发一次,导致插件重复运行。所以,本方案运行时,如果BOS IDE已配置相同插件,则BOS IDE配置的插件会被自动禁用。即时热更新 :不需要关闭单据重新打开也能热更新。可调试:这很重要,调试不了难道靠ShowMessage弹窗调试吗。统一文件配置,方便管理使用方法(使用工具)
点击菜单“插件热更新”,显示热更新界面
维护好金蝶Bin目录点击“添加”,选择表单ID在对应的插件栏目输入真实的插件类名(格式:完整命名空间.类名,dll文件名),多个插件用回车隔开操作插件比较特殊,需维护:操作代码=插件内码,如果一个操作代码有多个插件,则维护多行保存,点击“安装”,根据实际情况选择是否重启IIS或者清除缓存(详见:需重启情况说明)不需要此功能可以点击卸载,会对安装时进行的所以操作进行反操作。新增功能“导入”,可在BOS IDE配置好插件后,点击导入。系统会自动根据已配置的插件(移除金蝶的插件),其余插件会导入到配置里面,无需维护。使用方法(手工)
下载工具,从里面复制出文件: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时需重启
需重启情况说明
本方案在特定情况下需要重启的
首次安装(从未使用本方案或卸载后再次安装都视为首次安装)新增的业务对象添加插件(这个有办法可以不重启,先不弄了,目前需要重启)
以下情况可以通过清除K3Cloud缓存而不需要重启(但表单需关闭重开)
为已有表单添加其他插件启用或禁用
清除缓存方法:金蝶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,在弹出窗口后再改代码,虽然热更新了,但界面不会变化,这种需关闭表单重新打开才会有效果。