2016-08-26 11 views
0

Xilium.CefGlueとXilium.CefGlue.WPFを使用してwpfアプリケーションを開発しています。 SampleCefAppでXilium.CefGlue.CefApp.GetRenderProcessHandler()を実装した後、私のWPFアプリケーションがクラッシュするこの実装の前に、アプリケーションはクラッシュすることなく正常に動作していました。実際には、私はjavascript関数でHTMLのローカルページからC#関数を呼び出す必要があります。この機能は、32ビット版では正常に動作していますが、64ビット版では正常に動作していません。以下は私の実装です。JSのCefApp.GetRenderProcessHandler()をC#呼び出しにオーバーライドした後、WPFアプリケーションがクラッシュする

次のメッセージが64ビットでの作業中に

<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> 

がlibcef DLLのすべての問題THERですアプリのクラッシュのために示した

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

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

。 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)); 
} 

何か助けていただければ幸いです。

答えて

0

cef loggingを有効にしました。次のログを表示します [0826/171951:ERROR:proxy_service_factory.cc(128)]シングルプロセスモードでV8プロキシリゾルバを使用できません。 。私はCeffSettingでSingleProcess = falseを変更しました。クラッシュする問題が解決され、要求されたWebページがcefwpfbrowserに表示されません。 は、今私は、ログファイルから次のようなメッセージを取得しています [0826/173636:VERBOSE1:pref_proxy_config_tracker_impl.cc(151)] 000000001B2A7CC0:に設定されたクロムのプロキシ設定サービス000000001B234F60 [0826/173636:VERBOSE1:pref_proxy_config_tracker_impl.cc(276) ] 000000001B2A7CC0:UpdateProxyConfigへのプッシュプロキシの完了 [0826/173637:VERBOSE1:webrtc_internals.cc(85)]ダウンロードディレクトリを取得できませんでした。 cefwpfbrowserで要求されたページを読み込まない問題を解決する方法。

関連する問題