You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CefSharp中JavaScript同步调用C#函数失败问题求助

CefSharp中JavaScript调用C#函数的问题排查与解决

问题分析

当前代码存在几个关键问题导致JS无法调用C#函数:

  1. C#方法内部变量名错误:OnText方法参数为currentText,但输出时误用了未定义的newText,会引发编译错误。
  2. JS对象注册时机不对:直接在控件初始化阶段注册对象,此时浏览器框架可能尚未加载完成,导致注册失效。
  3. JS调用方式不匹配:CefSharp默认以异步方式暴露C#方法,同步调用会失效;若未配置同步调用,JS需用异步语法调用。

修正后的代码示例

C# 代码

首先修正方法内的变量错误,并确保在浏览器主框架加载完成后注册JS对象:

private ChromiumWebBrowser _mView;
private GMManager _jManager;

// 初始化控件与Cef(应用启动时执行)
public void InitializeBrowser()
{
    // 初始化Cef(仅需调用一次)
    Cef.Initialize(new CefSettings());
    
    _mView = new ChromiumWebBrowser("index.html");
    _jManager = new GMManager();
    
    // 监听主框架加载完成事件,在此注册JS对象
    _mView.FrameLoadEnd += (sender, args) =>
    {
        if (args.Frame.IsMain)
        {
            // 注册对象,isAsync设为false启用同步调用(按需选择)
            _mView.JavascriptObjectRepository.Register("javaManager", _jManager, isAsync: false);
        }
    };
}

public class GMManager
{
    public void OnText(string currentText)
    {
        // 修正变量名,匹配方法参数
        Console.WriteLine("Do things: " + currentText);
    }
}

JavaScript 代码

根据C#注册时的isAsync设置,选择对应调用方式:

同步调用(对应isAsync: false)

function reportChanged() {
    try {
        let currValue = editor.getValue();
        window.javaManager.OnText(currValue);
    } catch (err) {
        console.error("调用C#方法失败:", err);
    }
}

异步调用(对应默认isAsync: true)

async function reportChanged() {
    try {
        let currValue = editor.getValue();
        await window.javaManager.OnText(currValue);
    } catch (err) {
        console.error("调用C#方法失败:", err);
    }
}

额外注意事项

  • 确保CefSharp版本为最新稳定版,旧版本可能存在API差异。
  • 若使用WPF/WinForms,需确保ChromiumWebBrowser控件已正确添加到可视化树并完成加载。
  • 加入try-catch捕获JS端错误,便于快速定位问题(比如对象未注册、参数类型不匹配等)。

内容的提问来源于stack exchange,提问作者Gonçalo Castilho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:20:19