二开案例.表单插件.获取调用堆栈

【应用场景】插件代码跟踪调试。
例如:我的某个插件事件被调用了多次,怎么知道是谁在调用,是从哪个路线发起的调用?
【案例演示】采购订单,抓取表单插件的菜单点击事件的调用堆栈。

【实现步骤】
<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
{
pub
二开案例.表单插件.获取调用堆栈
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



