二开案例.表单插件.获取调用堆栈
【应用场景】插件代码跟踪调试。
例如:我的某个插件事件被调用了多次,怎么知道是谁在调用,是从哪个路线发起的调用?
【案例演示】采购订单,抓取表单插件的菜单点击事件的调用堆栈。
【实现步骤】
<1>编写表单插件,代码如下。
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Log;
using Kingdee.BOS.Util;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
namespace Jac.XkDemo.BOS.Business.PlugIn
{
/// <summary>
/// 【表单插件】获取调用堆栈
/// </summary>
[Description("【表单插件】获取调用堆栈"), HotUpdate]
public class SaveStackLogFormPlugIn : AbstractDynamicFormPlugIn
{
public override void BarItemClick(BarItemClickEventArgs e)
{
base.BarItemClick(e);
// 获取调用堆栈
var log = CatchStack();
this.View.ShowMessage(log);
}
/// <summary>
/// 获取当前代码块的调用堆栈
/// </summary>
/// <returns></returns>
private static string CatchStack()
{
var logs = new List<string>();
var stackFrames = new StackTrace().GetFrames();
if (stackFrames == null)
{
return string.Empty;
}
foreach (var stackFrame in stackFrames)
{
var method = stackFrame.GetMethod();
var log = string.Format("【{0}】=>{1}->{2}->{3}", method.Name, stackFrame.GetMethod().Module, method.DeclaringType.FullName, stackFrame.GetMethod());
logs.Add(log);
}
var logData = string.Join("\r\n", logs);
Logger.Error("DBG", logData, null);
return logData;
}
}
}
<2>编写服务插件,代码如下。
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Log;
using Kingdee.BOS.Util;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
namespace Jac.XkDemo.BOS.Business.PlugIn
{
/// <summary>
/// 【服务插件】获取调用堆栈
/// </summary>
[Description("【服务插件】获取调用堆栈"), HotUpdate]
public class CatchStackOperationServicePlugIn : AbstractOperationServicePlugIn
{
public override void BeforeExecuteOperationTransaction(BeforeExecuteOperationTransaction e)
{
base.BeforeExecuteOperationTransaction(e);
// 获取调用堆栈
CatchStack();
}
/// <summary>
/// 获取当前代码块的调用堆栈
/// </summary>
/// <returns></returns>
private static string CatchStack()
{
var logs = new List<string>();
var stackFrames = new StackTrace().GetFrames();
if (stackFrames == null)
{
return string.Empty;
}
foreach (var stackFrame in stackFrames)
{
var method = stackFrame.GetMethod();
var log = string.Format("【{0}】=>{1}->{2}->{3}", method.Name, stackFrame.GetMethod().Module, method.DeclaringType.FullName, stackFrame.GetMethod());
logs.Add(log);
}
var logData = string.Join("\r\n", logs);
Logger.Error("DBG", logData, null);
return logData;
}
}
}
<3>拷贝插件组件到应用站点的WebSite\Bin目录下,重启IIS。
<4>BOSIDE扩展采购订单,注册表单插件,保存操作注册服务插件,保存元数据,开发完毕。
现在可以登录业务站点,打开采购订单新增界面,点击任意菜单,抓取当前菜单的调用堆栈了。
服务插件也是类似用法,只是服务插件写的日志不太好输出到界面,建议直接去日志文件看调用堆栈。
---------------------------------------------------------------------------------------------------------
【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696
二开案例.表单插件.获取调用堆栈
本文2024-09-23 04:20:05发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-164638.html