Logo

Logo

关于CefSharp中C#与JS函数互相调用的应用

Pastore Antonio
Pastore Antonio 2023年12月08日
337 阅读 0 评论 约 2226 字 阅读约 5 分钟

作者:咕魂

时间:2022年5月6日

大量博文可以看到一些C#与JS脚本相互调用的案例,但是不同版本的CefSharp使用时还是有一点不同,博主本次使用的CefSharp版本为100.0.230.0,查看方法按住Ctrl点击ChromiumWebBrowser可以看到程序集开头有写到版本号。

接下来是正文:

JS调用C#函数

// 使用ChromiumWebBrowser时进行的状态设置
// 其中chromiumWebBrowser为实例化的ChromiumWebBrowser对象,
// CefSharpSettings是直接设置静态类的属性,也能先创建对象,但是没必要
chromiumWebBrowser.JavascriptObjectRepository.Settings.LegacyBindingEnabled = true;
CefSharpSettings.WcfEnabled = true;
chromiumWebBrowser.JavascriptObjectRepository.Register("bound", new BoundObject(), isAsync: false, options: BindingOptions.DefaultBinder);
// BoundObject.class的写法
class BoundObject
{
  public string hello()
  {
    return "hello";
  }
}

注:旧版本使用

chromiumWebBrowser.RegisterJsObject("bound", new BoundObject(), options: BindingOptions.DefaultBinder);

并且博主使用时直接使用“CefSharpSettings.LegacyBindingEnabled会出现LegacyBindingEnabled`未定义的错误。

html中调用函数的代码:

<script>
  // 如果bound对象存在,则调用bound中的hello函数
  // 注意此处bound字段一定要和之前代码Register函数的第一个参数一致
  if(bound){
    console.log(bound.hello());
  }
</script>

不出意外,你能够在C#程序运行后,查看浏览器组件的控制台,可以看到hello的输出信息。

C#调用JS函数

// 其中chromiumWebBrowser为实例化的ChromiumWebBrowser对象
string javascript = "hello();";
chromiumWebBrowser.ExecuteScriptAsync(javascript);

html中的代码

<script>
    function hello(){
        console.log("hello")
    }
</script>

如果你是和我一样,在chromiumWebBrowser刚刚加载页面后就直接调用ExecuteScriptAsync()函数执行JS脚本,不出意外应该会报一个hello未定义的错误。

但是如果把调用ExecuteScriptAsync()的函数写在winform的按钮事件中,加载完页面之后,点击按钮再执行,就能够成功在浏览器组件的控制台看到输出的hello字样。

总结

按理来说,如果在页面刚刚加载就执行一段脚本从C#传数据过来,两种方法应该都是可行的,但C#调用JS函数时一定要等页面完整加载之后再调用,不然会出现函数未定义的情况,可以先查询一下页面加载的情况再执行,这里,我使用的是第一种(JS调用C#函数)方法,通过JS调用C#函数来传递数据。

之后如果html页面中的触发函数需要执行C#函数,就使用第一种(JS调用C#函数)方法,如果是winform组件的触发事件要执行JS函数,就使用第二章(C#调用JS函数)方法。

C#数据往JS部分传递两种方法都可以,但JS的数据往C#部分传递,则只能使用第一种(JS调用C#函数)方法。

提示

打开浏览器控制台的方法:

// 点击按钮button1打开控制台,也能写到其他chromiumWebBrowser初始化之后的地方
private void button1_Click(object sender, EventArgs e)
{
  if (chromiumWebBrowser != null)
  	chromiumWebBrowser.ShowDevTools();
  else
  	MessageBox.Show("浏览器暂未加载...");
}

相关连接:

cefsharp 如何成功获取加载完毕后,网页的源代码-前端-CSDN问答

CefSharp内核浏览器之C#与js的互相调用_饮尽鸿爪下的雪泥的博客-CSDN博客

升级CefSharp解决RegisterJsObject方法弃用问题_黑石雨的博客-CSDN博客

CefSharpSettings.LegacyJavascriptBindingEnabled 没有该属性 – 简书 (jianshu.com)

查看完整代码

橙子主题打折出售

其实我不卖,主要是这里是放广告的,所以就放了一个
毕竟主题都没做完,卖了也是坑.

购买它
部分文章可能存在转载,如果涉及到侵权,请联系删除文章。

探索AIGC相关的精彩内容,共 15 篇文章

Azure AI 服务之语音识别

简介 Azure AI 服务中的语音识别 API 是微软提供的一项先进技术,旨在帮助开发者轻松实现语 ... 关于CefSharp中C#与JS函数互相调用的应用

2026-02-17 · Xzavier Aaron
MCP | 一文详解什么是 MCP以及 MCP 可以做什么

一、什么是 MCP MCP(Model Context Protocol)是一个专为大型语言模型(L ... 关于CefSharp中C#与JS函数互相调用的应用

2026-02-14 · Shen, Luke
你的工作流程,值得一个“全自动数字分身”:录制、截图、成文,一气呵成

一、一句话认识 TestFlow Recorder 在数字化工作环境中,如何准确记录操作步骤并生成清 ... 关于CefSharp中C#与JS函数互相调用的应用

2026-02-14 · Xzavier Aaron
Flowise 前端框架配置指南

用户需求 问题:有没有适合配置 Flowise 的前端框架? 目标:寻找类似 Open WebUI ... 关于CefSharp中C#与JS函数互相调用的应用

2026-02-14 · Xzavier Aaron