使用CefGlue / CEF3从JavaScript调用.NET

时间:2015-06-15 22:56:05

标签: javascript c# chromium-embedded cefglue

CefGlue现有解决方案:Call .Net from javascript in CefSharp 1 - wpf

我想要这个,但对于CefGlue:我想使用JavaScript与App通信。因此,当我单击HTML网站中的按钮时,我希望应用程序处理此问题(例如:启动tcp服务器)。

我尝试注册一个自己的CefV8Handler但没有成功,从不调用处理程序上的Execute函数。这就是我现在所做的事情

    protected override void OnWebKitInitialized()
    {
        Console.WriteLine("Registering testy extension");
        Xilium.CefGlue.CefRuntime.RegisterExtension("testy", "var testy;if (!testy)testy = {};(function() {testy.hello = function() {};})();", new V8Handler());
        base.OnWebKitInitialized();
    }

我的V8Handler代码如下所示:

public class V8Handler : Xilium.CefGlue.CefV8Handler
{

    protected override bool Execute(string name, CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue, out string exception)
    {

        if (name == "testy")
            Console.WriteLine("CALLED TESTY");
        else
            Console.WriteLine("CALLED SOMETHING WEIRED ({0})", name);

        returnValue = CefV8Value.CreateNull();
        exception = null;
        return true;

    }

}

我处于多进程模式,没有控制台窗口显示“CALLED TESTY”,也没有“CALLED SOMETHING WEIRED”。

1 个答案:

答案 0 :(得分:1)

找到了解决方案。诀窍是创建一个CefV8Value(CreateFunction)并将其分配给V8Handler。然后将此值分配给全局上下文。这就是它的样子:

internal class RenderProcessHandler : CefRenderProcessHandler
{

    protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context)
    {
        CefV8Value global = context.GetGlobal();
        CefV8Value func = CefV8Value.CreateFunction("magic", new V8Handler());
        global.SetValue("magic", func, CefV8PropertyAttribute.None);
        base.OnContextCreated(browser, frame, context);
    }

}

出现了另一个问题:它是在渲染器进程中调用的,但我在浏览器进程中需要回调。在CefV8Handlers执行函数中我做了这个:

var browser = CefV8Context.GetCurrentContext().GetBrowser();
browser.SendProcessMessage(CefProcessId.Browser, CefProcessMessage.Create("ipc-js." + name));

这样我可以在CefClient实现中的OnProcessMessageReceived函数中检索消息。