Я с трудом начинаю. Сначала я попытался использовать пакет (ы) 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. Но я все еще получаю это исключение.
Хорошо, я бегу сейчас. Хотя с полным исходным кодом вместо пакета NuGet. Я выяснил, что мне нужно сделать несколько вещей:
Согласно FAQ:
https://github.com/cefsharp/CefSharp/wiki/Frequently-asked-questions#Runtime_dependencies
Скопируйте следующие файлы в каталоги / 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, чтобы вы могли видеть любые ошибки в файле журнала. Они могут быть спасителями.