WPF界面 调用C++ Dll 时Log输出实现

使用委托和回调函数实现:

C#:

1、创建委托 

        public delegate void CSharpLogCallback(ref INSTINFO Loginfo);
        public CSharpLogCallback cSharpLog;

2、托管

        private bool InitlogCallback()
        {
            cSharpLog = new CSharpLogCallback(Showlogfunction);
                return InstrumentAPI.setCPlusLogCallback(Marshal.GetFunctionPointerForDelegate(cSharpLog)) != 0;
            }
        }

3、Showlogfunction实现

        void Showlogfunction(ref INSTINFO Loginfo)
        {
            if (instModel.enableLog)
            {
                Loginfo.logdata = Loginfo.logdata.TrimEnd("\n".ToCharArray());
                ShowLog(Loginfo.logdata, Convert.ToBoolean(Loginfo.input));
                return;
            }
            else
                return;
        }

        public void ShowLog(object send, bool input)
        {
            Dispatcher.Invoke(new Action(delegate
            {

                string strTime = "";
                if (input)
                {
                    strTime = "[" + System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "] <<< ";
                }
                else
                {
                    strTime = "[" + System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "] >>> ";
                }
                rtbLogPanel.AppendText(strTime + send.ToString() + "\r");
                rtbLogPanel.ScrollToEnd();

            }));
        }

4、C# API接口:

        [DllImport("TestSetManage.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "setCPlusLogCallback")]
        public static extern int setCPlusLogCallback(IntPtr logCallback);

C++

1、定义函数指针:

typedef void(*CPPLogCallback)(INSTINFO& info);

2、定义接口并实现接口:

    TestSetControl_API void __cdecl setCPlusLogCallback(CPPLogCallback logcb);

        void __cdecl setCPlusLogCallback(CPPLogCallback logcb)
        {
            pTestSetCtrl->comfun.logcallbackptr = logcb;
            return;
        }

至此,在类的实例comfun中C#的logcallbackptr已接收到C#传下来的函数指针,可直接使用,

使用如下:

bool CommonFunc::AddToLog(char* cmdstr,int type)
{
    INSTINFO instinfo;
    memcpy(instinfo.logdata, "", sizeof instinfo.logdata);
    strcat(instinfo.logdata, cmdstr);
    instinfo.input = type;
    logcallbackptr(instinfo);
    return true;
}

以上学习过程记录,仅展示了关键代码。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
log4net 是一个开源的日志记录工具,可以用于在应用程序中记录日志。它可以在 WPF 界面中使用,以便在应用程序中捕获和显示日志信息。 在 WPF 界面中使用 log4net 需要进行一些配置。首先,需要在应用程序的配置文件中添加 log4net 的配置信息,包括日志输出的目标(如文件、数据库、控制台等)、日志级别、格式等。然后,在代码中进行初始化,加载配置文件。 在 WPF 界面中,可以用 log4net 来记录应用程序中的各种操作、异常等信息。可以通过在代码中插入 log4net 的日志记录语句,比如使用 Logger 类的 Info、Debug、Error 等方法来记录不同级别的日志信息。这些日志信息会被保存到指定的输出目标中。 除了记录日志信息,log4net 还提供了一些其他的功能,比如日志信息的过滤、格式化、追踪和一些附加信息的添加等。在 WPF 界面中,可以根据需要使用这些功能来进行日志记录和显示。 在 log4net 中,还可以根据不同的类别来对日志信息进行分类,这样可以更好地组织和管理日志。可以通过在配置文件中设置不同名称的 logger 来区分不同的日志类别,然后在代码中使用对应的 logger 来记录日志。 总之,log4net 是一个功能强大的日志记录工具,可以在 WPF 界面中使用。通过合理配置和使用,可以方便地在应用程序中捕获和显示各种日志信息,以便进行调试和问题定位。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值