cefsharp 84.4.10 如何在js中暴露c#类

本文详细解析了从CEFSharp79版本开始,JS对象注册方式的变化。介绍了新的BindingOptions设置方法,以及如何在JS中正确调用C#对象的方法。强调了在页面加载完成后使用CefSharp.BindObjectAsync确保JS对象可用的重要性。

从cefsharp79版本开始,旧的RegisterJsObject方法被删除了。
也就是说想使用79以后的版本,就必须更新js暴露c#对象的方法了。话不多说直接上代码:

BindingOptions bindingOption = new BindingOptions { 
CamelCaseJavascriptNames = false, 
Binder = BindingOptions.DefaultBinder.Binder };

CWBrowser.JavascriptObjectRepository.Register("cefCardReader", new CefCardReader(), false);

首先在创建了ChromiumWebBrowser实例之后,要注册对象,这一步和之前没什么大的变化,只是注册方法改了一下。但是如果你以为这样注册一下就能和之前一样使用那你就太天真了。
现在你注册之后,要想在js中使用cefCardReader中的方法,在使用之前你需要这样:

CefSharp.BindObjectAsync('cefCardReader');
cefCardReader.add();

我为了省掉这一步我会在Frame加载完成之后,这样做:

		/// <summary>
        /// 加载结束事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void CWBrowser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("(function(){")
                .Append("CefSharp.BindObjectAsync('cefCardReader');")            
                .Append("})();");
            browser.GetFocusedFrame().EvaluateScriptAsync(sb.ToString());
        }

这里面又有一个要注意的地方,这个CefSharp.BindObjectAsync在你每新开一个标签页的时候都需要重新调用一次,这就是我为什么把它放在FrameLoadEnd的中执行的原因。

最后在说一下,新注册方法的问题,由于Frame加载回调并不能保证页面的js方法都还没有执行,所以会导致一些在页面加载过程中就开始执行的js方法如果调用了cefCardReader的方法会失败。而解决方法就是在调用之前调用CefSharp.BindObjectAsync('cefCardReader');

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值