Не удается загрузить веб-страницу с помощью встроенного в браузер элемента управления Chromium CefSharp?

Я с трудом начинаю. Сначала я попытался использовать пакет (ы) NuGet. Когда я установил их, ни одна из необходимых ссылок на CefSharp DLL-файлы обнаружились в моем списке литературы. Поэтому я добавил их вручную, выполнив поиск / пакеты подкаталог. Получив свой проект для сборки, я обнаружил, что при выполнении загрузки URL ничего не случилось. Не загружена веб-страница, нет сообщений об ошибках и исключений. Ничего такого.

Я удалил CefSharp Пакет (ы) Nuget полностью и вытащил последний источник репо из GitHub. Сначала я убедился, что загрузка URL работала нормально из проекта CefSharp.WinForms.Example. Это работало отлично. Затем я скопировал необходимый набор проектов из решения CefSharp в решение моего проекта, пока мое решение не было собрано правильно. Я добавил форму BrowserForm из CefSharp.WinForms.Example проект, чтобы убедиться, что это не мой код. Однако, когда я открываю эту форму во время выполнения, введите URL-адрес в адресную строку и щелкните Идти Кнопка ничего не происходит. Прямо как раньше.

Я проследил код и нашел точку сбоя в этом методе C ++ в ManagedCefBrowserAdapter.h:

    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, и, тем не менее, ему говорят так, как будто это так. (Или мой анализ значения {CefRefPtr} неверен, как и мой анализ.)

В любом случае оператор if обрабатывает текущее значение cefFrame как равный nullptr и пропускает строку, которая вызывает LoadURL () метод на cefFrame объект ссылки. Я отслеживаю этот же код в моей копии GitHub CefSharp решение репо и Это делает введите блок «если» и выполнить LoadURL () метод. Я проверил значение cefFrame, и оно совпадает со значением в моем приложении. По какой-то действительно странной причине, либо здесь, или в моем приложении, есть более коварная проблема, либо это действительно помогает cefFrameценность {} CefRefPtr такой же как nullptr-х когда это не должно

Я был бы очень признателен, если бы кто-нибудь имел представление о том, как я могу заставить вещи работать в моем коде.

ОБНОВЛЕНИЕ: Я проверил трижды, и конфигурации сборки идентичны между решением GitHub CefSharp, которое работает, и моим проектом, который не работает. Все установлено на x86, кроме проекта Core, который установлен на Win32 (в обоих случаях).

Я только что сделал перестройку и, кроме того, я просмотрел каждый включенный проект и вручную полностью удалил каталоги / 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. Но я все еще получаю это исключение.

0

Решение

Хорошо, я бегу сейчас. Хотя с полным исходным кодом вместо пакета NuGet. Я выяснил, что мне нужно сделать несколько вещей:

Согласно FAQ:

https://github.com/cefsharp/CefSharp/wiki/Frequently-asked-questions#Runtime_dependencies

  • Убедитесь, что ВСЕ проекты настроены на сборку и построены как проекты x86
  • Скопируйте следующие файлы в каталоги / bin / Debug и / bin / Release. Недостаточно просто ссылаться на них в вашем основном приложении:

    • libcef.dll

    • icudtl.dat

    • CefSharp.dll

    • CefSharp.WinForms.dll

  • Инициализируйте библиотеку Cef, используя код, подобный показанному ниже, в методе, произвольно называемом Init (). Убедитесь, что вы вызываете свой метод Init () как самое первое в вашем методе Main () в Program.cs:

    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, чтобы вы могли видеть любые ошибки в файле журнала. Они могут быть спасителями.

0

Другие решения