Почему мой coreWebView2, который является объектом webView2, равен нулю?

Я создаю объект Microsoft.Web.WebView2.WinForm.WebView2, но субобъект этого coreWebView2 имеет значение null

Microsoft.Web.WebView2.WinForm.WebView2 webView = new Microsoft.Web.WebView2.WinForm.WebView2()
// Change some GUI properties of webView
webView.CoreWebView.NavigateUrl(url)
// I can not access the above line because CoreWebView is null

17 ответов

Использовать EnsureCoreWebView2Async метод инициализации базового CoreWebView2свойство. Это задокументировано в MSDN. Это свойствоnull при инициализации WebView2 объект класса.

CoreWebView2 Базовый CoreWebView2.

общедоступный CoreWebView2 CoreWebView2

Используйте это свойство, чтобы выполнять больше операций с содержимым WebView2, чем отображается в WebView2. Это значение равно нулю, пока не будет инициализировано. Вы можете принудительно инициализировать базовый CoreWebView2 с помощью метода InitializeAsync (EnsureCoreWebView2Async - по-видимому, Microsoft не удалось обновить свою документацию).

Источник (https://docs.microsoft.com/en-us/microsoft-edge/webview2/reference/winforms/0-9-515/microsoft-web-webview2-winforms-webview2)

Я перепробовал все в Интернете, но CoreWebView2 всегда был null.

Оказывается, мне не хватало среды выполнения для Edge.

Затем я установил его с помощью автономного установщика Evergreen из Microsoft Edge WebView2 . И тогда это сработало!

Вы можете использовать EnsureCoreWebView2Asyncчтобы убедиться, что объект инициализирован, прежде чем выполнять какие-либо действия. Однако, что еще проще, вы можете установитьSource свойство, которое гарантирует, что инициализация запущена, если еще не была:

Microsoft.Web.WebView2.WinForm.WebView2 webView = new Microsoft.Web.WebView2.WinForm.WebView2();
webView.Soure = url;

Использовать webView2.EnsureCoreWebView2Async();в начале программы для инициализации и создания события, чтобы проверить, инициализировано оно или нет.

      bool ensure = false;

private void webView21_CoreWebView2InitializationCompleted(object sender, Microsoft.Web.WebView2.Core.CoreWebView2InitializationCompletedEventArgs e)
{
    ensure = true;
}

Рабочая демонстрация: https://www.youtube.com/watch?v=S6Zr5T9UXUk

Сначала вам нужно инициализировать webview2, используя следующий код.

      WebView21.EnsureCoreWebView2Async()

Затем вы должны написать следующий код в событии с именем CoreWebView2InitializationCompleted.

      WebView21.CoreWebView2.Navigate(yoururl)
          private async void Form1_Load(object sender, EventArgs e)
    {
        await webView2.EnsureCoreWebView2Async();
        webView2.CoreWebView2.Settings.IsStatusBarEnabled = false;
        webView2.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false;

        webView2.Source = new Uri("https://someurl.com/");
    }

В моем случаеBadImageFormatExceptionбыл по причинеPlatformTarget x86. После изменения его наAnyCPUилиx64,await webView.EnsureCoreWebView2Async(null);должно работать, а затемwebView.CoreWebViewтакже не должен быть нулевым.

Как сказал @Abbas Tambawala в комментарии, вы должны убедиться, что ваш проект настроен на определенную разрядность. Иногда кажется, что настройка AnyCPU по умолчанию работает, но элемент управления не инициализируется, await webView.EnsureCoreWebView2Async вернет Задачу, которая никогда не завершается, CoreWebView2будет нулевым , и другие симптомы будут подсказкой для проверки этого параметра в вашем проекте.

Кроме того, имейте в виду, что если вы работаете над решением с несколькими проектами, как я ... вам необходимо убедиться, что все проекты последовательно помечены правильно.

Проект DLL, над которым я работал, был помечен как X86, но проект, который загружал мою DLL, был помечен как «AnyCPU». Происходит много моментов WTF ... комментарий о «предпочитаю 32-битный» ответу Райана дал момент «А-А».

Кроме того, вы можете проверить, какое событие или метод вы устанавливаете webView2.Source или вызываете EnsureCoreWebView2Async в ... webView2 требует, чтобы поток пользовательского интерфейса был полностью инициализирован и отображалась форма. Обычно я помещаю свой код инициализации webView2 в событие Form.Shown. Вот ссылка, описывающая порядок событий формы: События формы MS-Docs

Я обошел эту проблему в своем визуальном базовом проекте, установив логическую переменную в событии WebView2.CoreWebView2Ready, а затем вызвал одноразовый цикл событий do, чтобы дождаться события активации форм, чтобы проверить переменную, чтобы убедиться, что она инициализирована и готова к использовать

Я заметил, что даже после await Async он все еще не был готов к немедленному использованию, а corewebview2 оставался нулевым, но это может быть вещь vb

Вот пример, преобразованный в C # из моего визуального базового проекта webview2, он должен работать на C #

      class SurroundingClass
{
    private bool FstRun = true;
    private bool WebReady = false;

    private void Form1_Activated(object sender, EventArgs e)
    {
        if (FstRun == true)
        {
            FstRun = false;
            InitAsync();
            Wait();  // wait for webview to initiaise
           // code or sub here to reference the control navigate ect
        }
    }
    private void WebView21_CoreWebView2Ready(object sender, EventArgs e)
    {
        WebReady = true;
    }

    private async void InitAsync()
    {
        await WebView21.EnsureCoreWebView2Async;
    }

    private void Wait()
    {
        while (!WebReady == true)
            System.Windows.Forms.Application.DoEvents();
    }
}

Если вы можете получить доступ к своему элементу управления в коде позади, вы можете использовать CoreWebView2InitializationCompletedобработчик события, чтобы иметь состояние, где CoreWebView2инициализируется. ( WebView2это x:nameуправления в моем случае.)

              WebView2.CoreWebView2InitializationCompleted += (sender, args) =>
        {
            if (args.IsSuccess)
            {
                var vw2 = (WebView2)sender;
                vw2!.CoreWebView2.Settings.AreDevToolsEnabled = false;
            }
        };

Дополнительные сведения см. во всплывающей подсказке обработчика событий в последних версиях.

Использование WebView2 1.0.1108.44.

Как ни странно, если что-то пойдет не так в ходе инициализации,EnsureCoreWebView2Async()вернется как обычно, и событие все равно сработает, как будто инициализация прошла успешно, ноCoreWebView2будет нулевым. Мы должны проверитьCoreWebView2InitializedEventArgs.ExceptionвCoreWebView2InitializationCompletedобработчик событий, чтобы увидеть, что пошло не так:

      public MainWindow()
{
    this.InitializeComponent();
    // Use the callback instead of awaiting Ensure... because the callback's args.Exception
    // tells us if something went wrong initializing the CoreWebView2
    this.MyWebView.CoreWebView2Initialized += MyWebView_CoreWebView2Initialized;
    MyWebView.EnsureCoreWebView2Async();
}

private void MyWebView_CoreWebView2Initialized(WebView2 sender, CoreWebView2InitializedEventArgs args)
{
    if (args.Exception != null)
    {
        LogHelper.Error("CoreWebView2 initialization failed", args.Exception);
    }
    else
    {
        InitializeMyWebView2();
    }
}

Если это приложение Windows, убедитесь, что у вас есть метод InitializeComponent() в конструкторе формы.

Убедитесь, что CoreWebView2Async не помог в моем случае. Единственное, что сработало, это удалить и переустановить среду выполнения webview2 из приложений и функций.

Документация сообщает, что это тяжелая операция, поэтому я рекомендую инициализировать corewebview2, когда это необходимо. Пример на VB.net ниже:

      Dim uriFile as string = "https://YourURLgoeshere"
    Try
      If WebView21 IsNot Nothing AndAlso Webview21.CoreWebView2 IsNot Nothing Then
         WebView21.CoreWebView2.Navigate(uriFile)
      Else
         WebView21.Source = New Uri(uriFile)
      End If
    Catch x As Exception
      'Do some exception management...
      
    End Try

У меня была та же проблема... Я разрабатывал для Windows 10 с использованием Visual Studio 2013 с последней версией пакета nuget Webview2, все работало отлично. Проблема началась, когда мне пришлось перейти на Windows 7, я заметил, что coreWebView2 имеет значение null. Я решил проблему, выполнив две вещи. Я скопировал папку времени выполнения, содержащую WebView2Loader.dll, в ту же папку, что и мой исполняемый файл, и установил свойство «Специальная версия = True» ссылок Microsoft.Web.WebView2.Core и Microsoft.Web.WebView2.WinForms. Я также загрузил пакет nuget webview2 версии 1.0.1587.40. Благодаря этому я смог нормально запустить свою программу в Windows 7.

У меня были аналогичные проблемы с моим настольным приложением Windows Forms (.NET Framework). Я использовал следующий код в моем Page_Loadсобытие (код на VB.NET, но его легко преобразовать в C#)

      WebView21.CreationProperties = New Microsoft.Web.WebView2.WinForms.CoreWebView2CreationProperties

Dim currentDirectory As String = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)

Dim strDir As String = currentDirectory & "\WebView2Runtime\Microsoft.WebView2.FixedVersionRuntime.99.0.1150.46.x86"  

WebView21.CreationProperties.BrowserExecutableFolder = strDir 

WebView21.Source = New Uri("Your URL")

Я сохранил папку (загруженную из раздела «Фиксированная версия» на веб-странице Microsoft) в папке «Отладка» моего проекта Visual Studio.

Важный момент, который я узнал от Microsoft WebView2веб-страница заключается в том, что путь, по которому сохраняется файл, должен называться абсолютно (например, C:\...а не как путь UNC ("Двойная обратная косая черта...") и не должен быть сетевым расположением (из этого я догадался, что исполняемый файл проекта и WebView2Runtimeдолжны быть на одном диске. Итак, я сохранил все, чтобы C:.

Если вы попали сюда и ваша проблема все еще не решена, обратите внимание, что используемая версия «WebView2Loader.dll» очень важна. У меня была почти такая же проблема с «Microsoft.WebView2.FixedVersionRuntime.101.0.1210.39.x64», когда я пытался использовать компонент WebView2 в оснастках MMC с типами «HTMLView» или «FormView».

Я просто скопировал вышеупомянутый файл dll (версия 1.0.1248.0, размер =157640 байт) по правильному пути, который был доступен для проекта (вы можете просто поместить его рядом с выходными файлами проекта, чтобы проверить его), а затем браузер WebView2 начал функционировать, как ожидалось. Сообщения об ошибках Microsoft иногда (по крайней мере, в моем случае) немного вводили в заблуждение и не давали достаточной и точной информации.

Я получил «BadImageFormatException», который обычно возникает, когда вы смешиваете цели платформы (например, используете файл dll, скомпилированный в X64, в приложении, предназначенном для x86, или наоборот) или смешиваете собственный код и .NET, но это не было моей проблемой вообще. Я надеюсь, что это поможет тому, кто может застрять.

Другие вопросы по тегам