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

  • Post author:
  • Post category:其他


从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');



版权声明:本文为wf2397108372原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。