0

私はそれを始めるのに苦労しています。まず、NuGet パッケージを使用してみました。それらをインストールしたときに、CefSharp DLL への必要な参照が参照リストに表示されませんでした。そのため、 /packagesサブディレクトリを検索して手動で追加しました。プロジェクトをビルドした後、URL ロードを実行しても何も起こらないことに気付きました。Web ページが読み込まれず、エラー メッセージも発生せず、例外も発生しません。何もない。

CefSharp Nuget パッケージを完全に削除し、 GitHub から最新のリポジトリ ソースを取得しました。最初に、CefSharp.WinForms.Example プロジェクトから URL の読み込みが正常に機能することを確認しました。それはうまくいきました。次に、ソリューションが適切にビルドされるまで、必要なプロジェクトのセットを CefSharp ソリューションからプロジェクトのソリューションにコピーしました。私のコードではないことを確認するために、 CefSharp.WinForms.Exampleプロジェクトから BrowserForm フォームを追加しました。しかし、実行時にそのフォームを開いて、アドレス バーに URL を入力し、[移動] ボタンをクリックしても何も起こりません。ちょうど前のように。

コードをトレースしたところ、 ManagedCefBrowserAdapter.hの次の C++ メソッドに障害点が見つかりました。

    void LoadUrl(String^ address)
    {
        _address = address;
        auto cefFrame = _renderClientAdapter->TryGetCefMainFrame();

        // This is where cefFrame is treated qual to nullptr despite 
        //  having the value of {CefRefPtr<CefFrame>}, thereby defeating
        //  the call to LoadURL().
        if (cefFrame != nullptr)
        {
            cefFrame->LoadURL(StringUtils::ToNative(address));
        }
    }

本当に奇妙な問題があることがわかりました。「if」ステートメントまでコードをトレースすると、cefFrameの値が次のようになっていることがわかります。

{CefRefPtr<CefFrame>}

ただし、明らかにNULLではありませんが、NULLであるかのようにいじめられています。(または、{CefRefPtr} 値の私の分析は間違っており、私の分析も間違っています。)

いずれの場合も、「if」ステートメントはcefFrameの現在の値をnullptrと等しいものとして扱い、 cefFrame参照オブジェクトでLoadURL()メソッドを呼び出す行をスキップします。GitHub CefSharpリポジトリのソリューションのコピー、これとまったく同じコードをトレースすると、「if」ブロックに入り、 LoadURL ()メソッドが実行されます。cefFrame の値を確認したところ、アプリにある値と同じです。本当に奇妙な理由で、ここまたは私のアプリにもっと陰湿な問題があるか、cefFrameの{CefRefPtr}の値を 実際にnullptrは、すべきでない場合です。

私のコードで物事を機能させる方法について誰かが何か考えを持っていれば、本当に感謝しています。

更新:トリプルチェックを行い、動作する GitHub CefSharp ソリューションと動作しないプロジェクトの間でビルド構成が同一です。Win32 に設定されている Core プロジェクトを除いて、すべてが x86 に設定されています (どちらの場合も)。

再構築を行い、その上で、含まれている各プロジェクトを調べて、/bin と /obj ディレクトリの両方を手動で完全に削除しました。プロジェクトを実行すると、何か違うことが起こっています。コードが新しい BrowserTabUserControl を作成しようとするたびに、未処理の例外が発生します。

System.IO.FileNotFoundException was unhandled
  _HResult=-2147024770
  _message=Could not load file or assembly 'CefSharp.Core.dll' or one of its dependencies. The specified module could not be found.
  HResult=-2147024770
  IsTransient=false
  Message=Could not load file or assembly 'CefSharp.Core.dll' or one of its dependencies. The specified module could not be found.
  Source=HiveMind3D_proto
  FileName=CefSharp.Core.dll
  FusionLog=""
  StackTrace:
       at HiveMind3D_proto.BrowserTabUserControl..ctor(String url)
       at HiveMind3D_proto.BrowserForm.AddTab(String url, Nullable`1 insertIndex) in c:\Users\Robert\Documents\Visual Studio 2012\Projects\Windows Forms\HiveMind3D_proto\HiveMind3D_proto\BrowserForm.cs:line 35
       at HiveMind3D_proto.BrowserForm..ctor() in c:\Users\Robert\Documents\Visual Studio 2012\Projects\Windows Forms\HiveMind3D_proto\HiveMind3D_proto\BrowserForm.cs:line 24
       at HiveMind3D_proto.Program.Main() in c:\Users\Robert\Documents\Visual Studio 2012\Projects\Windows Forms\HiveMind3D_proto\HiveMind3D_proto\Program.cs:line 26
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

メイン プロジェクトの CefSharp.Core プロジェクト参照を削除し、CefSharp.Core プロジェクトへの参照を再度追加して再追加しようとしました。しかし、私はまだその例外を取得します。

4

1 に答える 1

0

わかりました、私は今走っています。ただし、NuGet パッケージではなく完全なソースを使用します。私はいくつかのことをする必要があることがわかりました:

FAQに従って:

https://github.com/cefsharp/CefSharp/wiki/よくある質問#R​​untime_dependencies

  • すべてのプロジェクトがビルドおよび x86 プロジェクトとしてビルドするように設定されていることを確認します
  • 次のファイルを /bin/Debug および /bin/Release ディレクトリの両方にコピーします。メイン アプリでそれらを参照するだけでは十分ではありません。

    • libcef.dll

    • icudtl.dat

    • CefSharp.dll

    • CefSharp.WinForms.dll

  • 任意に Init() と呼ばれるメソッドで以下に示すようなコードを使用して、Cef ライブラリを初期化します。Program.cs の Main() メソッドで、最初に Init() メソッドを呼び出すようにしてください。

    public static void Init()
    {
        var settings = new CefSettings
        {
            LogSeverity = LogSeverity.Verbose,
            LogFile = "debug.log",
            RemoteDebuggingPort = 8088,
        };
    
        if (DebuggingSubProcess)
        {
            var architecture = Environment.Is64BitProcess ? "x64" : "x86";
            settings.BrowserSubprocessPath = "..\\..\\..\\..\\CefSharp.BrowserSubprocess\\bin\\" + architecture + "\\Debug\\CefSharp.BrowserSubprocess.exe";
        }
    
        settings.RegisterScheme(new CefCustomScheme
        {
            SchemeName = CefSharpSchemeHandlerFactory.SchemeName,
            SchemeHandlerFactory = new CefSharpSchemeHandlerFactory()
        });
    
        if (!Cef.Initialize(settings))
        {
            if (Environment.GetCommandLineArgs().Contains("--type=renderer"))
            {
                Environment.Exit(0);
            }
            else
            {
                return;
            }
        }
    }
    

ログ ファイルにエラーが表示されるように、ログ ファイルの詳細度を Verbose に設定することをお勧めします。彼らは命の恩人になることができます。

于 2015-01-18T02:16:33.497 に答える