0

我正在使用 Xilium.CefGlue 和 Xilium.CefGlue.WPF 开发一个 wpf 应用程序。在 SampleCefApp 中实现 Xilium.CefGlue.CefApp.GetRenderProcessHandler() 后,我的 WPF 应用程序崩溃了。在此实施之前,应用程序运行良好,没有任何崩溃。实际上我需要通过 javascript 函数从 html 本地页面调用 C# 函数。此功能在 32 位版本中运行良好,但在 64 位版本中无法正常运行。以下是我的实现。

internal sealed class SampleCefApp : CefApp
{
    public SampleCefApp()
    {

    }
    private CefRenderProcessHandler renderProcessHandler = new Views.DemoRenderProcessHandler();
    protected override CefRenderProcessHandler GetRenderProcessHandler()
    {
        return renderProcessHandler;
    }
}

以下消息显示应用程序崩溃

<ProblemSignatures>

    <EventType>APPCRASH</EventType>
    <Parameter0>StreetMap.vshost.exe</Parameter0>
    <Parameter1>14.0.23107.0</Parameter1>
    <Parameter2>559b788a</Parameter2>
    <Parameter3>libcef.DLL</Parameter3>
    <Parameter4>3.2743.1449.0</Parameter4>
    <Parameter5>57bbfe66</Parameter5>
    <Parameter6>80000003</Parameter6>
    <Parameter7>0000000000b68267</Parameter7>

</ProblemSignatures>

使用 64 位时 libcef dll 是否有任何问题。是否有人可以通过使用 Xilium.CefGlue 和 Xilium.CefGlue.WPF 来帮助实现 JS 到 C# 调用。我使用的以下参考代码来自链接 https://groups.google.com/forum/#!topic/cefglue/EhskGZ9OndY

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Threading;
using System;
namespace Xilium.CefGlue.Client {
    internal sealed class DemoApp: CefApp {
        private CefRenderProcessHandler renderProcessHandler = new DemoRenderProcessHandler();

        protected override CefRenderProcessHandler GetRenderProcessHandler() {
            return renderProcessHandler;
        }
    }

    internal class DemoRenderProcessHandler: CefRenderProcessHandler {
        MyCustomCefV8Handler myCefV8Handler = new MyCustomCefV8Handler();

        protected override void OnWebKitInitialized() {
            base.OnWebKitInitialized();

            var nativeFunction = @ "nativeImplementation = function(onSuccess) {
            native

            function MyNativeFunction(onSuccess);
            return MyNativeFunction(onSuccess);
        };
        ";

        CefRuntime.RegisterExtension("myExtension", nativeFunction, myCefV8Handler);
    }

    internal class MyCustomCefV8Handler: CefV8Handler {
        protected override bool Execute(string name, CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue,

            out string exception) {
            //Debugger.Launch();

            var context = CefV8Context.GetCurrentContext();
            var taskRunner = CefTaskRunner.GetForCurrentThread();
            var callback = arguments[0];
            new Thread(() => {
                //Sleep a bit: to test whether the app remains responsive
                Thread.Sleep(3000);

                taskRunner.PostTask(new CefCallbackTask(context, callback));

            }).Start();

            returnValue = CefV8Value.CreateBool(true);
            exception = null;
            return true;
        }
    }

    internal class CefCallbackTask: CefTask {
        private readonly CefV8Context context;

        private readonly CefV8Value callback;
        public CefCallbackTask(CefV8Context context, CefV8Value callback) {
            this.context = context;
            this.callback = callback;
        }

        protected override void Execute() {
            var callbackArguments = CreateCallbackArguments();

            callback.ExecuteFunctionWithContext(context, null, callbackArguments);
        }

        private CefV8Value[] CreateCallbackArguments() {
            var imageInBase64EncodedString = LoadImage(@ "C:\hamb.jpg");
            context.Enter();
            var imageV8String = CefV8Value.CreateString(imageInBase64EncodedString);
            var featureV8Object = CefV8Value.CreateObject(null);
            var listOfFeaturesV8Array = CefV8Value.CreateArray(1);

            featureV8Object.SetValue("name", CefV8Value.CreateString("V8"), CefV8PropertyAttribute.None);
            featureV8Object.SetValue("isEnabled", CefV8Value.CreateInt(0), CefV8PropertyAttribute.None);
            featureV8Object.SetValue("isFromJSCode", CefV8Value.CreateBool(false), CefV8PropertyAttribute.None);

            listOfFeaturesV8Array.SetValue(0, featureV8Object);
            context.Exit();

            return new [] {
                listOfFeaturesV8Array,
                imageV8String
            };
        }

        private string LoadImage(string fileName) {
            using(var memoryStream = new MemoryStream()) {
                var image = Bitmap.FromFile(fileName);

                image.Save(memoryStream, ImageFormat.Png);

                byte[] imageBytes = memoryStream.ToArray();

                return Convert.ToBase64String(imageBytes);
            }
        }
    }
}

我首先加载的HTML文件:

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="utf-8" />
        <title>C# and JS experiments</title>
        <script src="index.js"></script>
    </head>
    <body>
        <h1>C# and JS are best friends</h1>
        <div id="features"></div>      
        <div id="image"></div>
    </body>
</html>

JavaScript代码:

function Browser() {

}

Browser.prototype.ListAllFeatures = function(onSuccess) {
    return nativeImplementation(onSuccess);
}

function App(browser) {
    this.browser = browser;
}

App.prototype.Run = function() {
    var beforeRun = new Date().getTime();
    this.browser.ListAllFeatures(function(features, imageInBase64EncodedString) {
        var feautersListString = '';

        for (var i = 0; i < features.length; i++) {
            var f = features[i];

            feautersListString += ('<p>' + 'Name: ' + f.name + ', is enabled: ' + f.isEnabled + ', is called from js code: ' + f.isFromJSCode + '</p>');

        }

        feautersListString += '<p> The image: </p>';
        feautersListString += '<p>' + imageInBase64EncodedString + '</p>';
        document.getElementById("features").innerHTML = feautersListString;

        var afterRun = new Date().getTime();

        document.getElementById("image").innerHTML = '<img src="data:image/png;base64,' + imageInBase64EncodedString + '" />';

        var afterLoadedImage = new Date().getTime();
        console.log("ELAPSED TIME - INSIDE LIST ALL FEATURES: " + (afterRun - beforeRun));
        console.log("ELAPSED TIME - IMAGE IS LOADED TO THE <img> TAG: " + (afterLoadedImage - beforeRun));
    });
}

window.onload = function() {
    var browser = new Browser();
    var application = new App(browser);
    //Lets measure
    var beforeRun = new Date().getTime();

    application.Run();

    var afterRun = new Date().getTime();

    console.log("ELAPSED TIME - INSIDE ONLOAD: " + (afterRun - beforeRun));
}

任何帮助表示赞赏。

4

1 回答 1

0

我启用了cef日志记录。它显示以下日志 [0826/171951:ERROR:proxy_service_factory.cc(128)] 无法在单进程模式下使用 V8 代理解析器。.所以我改变了CeffSetting中的SingleProcess=false。现在崩溃问题解决了,然后请求的网页没有显示在 cefwpfbrowser 中。现在我从日志文件 [0826/173636:VERBOSE1:pref_proxy_config_tracker_impl.cc(151)] 000000001B2A7CC0: set chrome proxy config service to 000000001B234F60 [0826/173636:VERBOSE1:pref_proxy_2config_tracker_impl.cc(00176) 中收到以下消息完成将代理推送到 UpdateProxyConfig [0826/173637:VERBOSE1:webrtc_internals.cc(85)] 无法获取下载目录。如何解决 cefwpfbrowser 中请求的页面未加载问题。

于 2016-08-26T12:22:17.853 回答