Элемент управления WebView2 работает при отладке проекта WPF, но не после установки с помощью установщика vdproj

Решение ниже, спасибо Poul Bak и GrooverFromHolland за указание на мою плохую реализацию async, которая немного помогла. Я просто переместил назначение источника в тот же метод после ожидания, чтобы порядок операций был правильным, а также сначала должен был ожидать CoreWebView2Environment.CreateAsync. Не совсем уверен, почему это было необходимо из установленного места.

private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            InitWebviewAsync();
        }

private async void InitWebviewAsync()
        {
            var userDataFolder = Setting.ExeShortcutPath + "iGo360UtilitySettingWPF.exe.WebView2";
            var env = await CoreWebView2Environment.CreateAsync(null, userDataFolder);

            if (webView != null)
            {
                await webView.EnsureCoreWebView2Async(env);
                string url = AuthHelper._loginUrl;
                webView.Source = new Uri(url);
            }
        }

Сообщение об исходной проблеме ниже:

В настоящее время у меня есть проект WPF, который отлично работает с элементом управления WebView2 при отладке приложения с помощью Visual Studio 2019 (16.6.1) с Target .NET Framework 4.6.1.

Также установлено следующее:

  1. Microsoft Edge (90.0.818.42)
  2. runtimes \ win-x86 \ native \ WebView2Loader.dll (это разрешило DLLNotFoundException)

Проблема возникает, когда я устанавливаю этот проект через vdproj и запускаю приложение. Обратите внимание, что это находится на том же компьютере, что и среда отладки, что кажется еще более странным.

При написании этой проблемы я определил причину ошибки, о которой упоминаю ниже. Устраняя эти ошибки, я скопировал из папки отладки следующее:

  1. iGo360UtilitySettingWPF.exe.WebView2 (это устранило новую ошибку, край не мог записать в каталог)
  2. Как лучше всего включить эти 2 каталога в vdproj и управлять ими, чтобы избавиться от необходимости вручную копировать или добавлять их в мой проект хакерским способом?
  3. После InitializeComponent (); вы вызываете InitAsync. В это время возможно, что окно или WPF-страница еще не загружены. Лучше инициализировать его в событии Loaded:

Теперь моя текущая ошибка находится в строке ожидания inz InitAsync:

System.Runtime.InteropServices.COMException: 'Эта операция вернулась, поскольку истек период ожидания. (Исключение из HRESULT: 0x800705B4) '

Ошибки, которые у меня были изначально, но они были устранены выше: при попытке загрузки элемента управления WebView2 происходит сбой приложения. Вот методы construct и init, в которых происходит сбой в строке ожидания в InitAsync:

public Login()
{
    string url = AuthHelper._loginUrl;

    InitializeComponent();

    InitAsync();

    if (webView != null)
    {
        webView.Source = new Uri(url);
        //webView.NavigateToString(url);
    }
}

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

И средство просмотра событий регистрирует следующую ошибку:

Среда выполнения Microsoft Edge WebView2 (90.0.818.42)


person Matthew    schedule 24.04.2021    source источник
comment
Спасибо, что указали на это, я соответствующим образом очистил код. К сожалению, это не решило проблему, но я наткнулся на проблему и исправил ее. Не совсем уверен, почему, но в установленном исполнении мне нужно было указать каталог среды webview2 перед EnsureCoreWebView2Async .... И, конечно же, убедиться, что Source устанавливается после завершения ожидания ожидающего. Я добавлю обновленный код в свой пост для рабочего решения.   -  person Poul Bak    schedule 25.04.2021
comment
Возможно, вы правы, но с этой настройкой проблема не исчезла. Тем не менее, он отлично работает при отладке из Visual Studio, но выполнение этого приложения из установочного каталога по-прежнему дает сбой. Я почти уверен, что проблема связана с зависимостями времени выполнения / Edge WebView2, но я более или менее в растерянности.   -  person Matthew    schedule 25.04.2021


Ответы (2)


ожидание CoreWebView2Environment.CreateAsync (null, userDataFolder); было необходимо перед ожиданием webView.EnsureCoreWebView2Async

 private async void Login_Loaded(object sender, RoutedEventArgs e)
        {
            if (webView != null)
            {
                try
                {
                    await webView.EnsureCoreWebView2Async(null);
                    webView.Source = new Uri("https://etc");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
person GrooverFromHolland    schedule 25.04.2021
comment
Спасибо, что опубликовали решение этой проблемы. Вы можете отметить свой ответ как принятый через 48 часов, когда он будет доступен для отметки. Это может помочь другим членам сообщества в будущем в подобных вопросах. Спасибо за понимание. - person Matthew; 25.04.2021

И убедитесь, что webView.Source вызывался только после завершения выполнения webView.EnsureCoreWebView2Async.

Также убедитесь, что права доступа к папке с данными установлены правильно.

Вы не _1_ InitAsync (); - это означает, что код сразу перейдет к следующей строке.

person Matthew    schedule 25.04.2021
comment
Приложение: MyWebView2Wpf.exe Версия Framework: v4.0.30319 Описание: Процесс был прерван из-за необработанного исключения. Информация об исключении: System.DllNotFoundException в Microsoft.Web.WebView2.Core.CoreWebView2Environment.CreateCoreWebView2EnvironmentWithOptions (System.String, System.String, Microsoft.Web.WebView2.Core.RawView.ICoreWebView2EnvironmentOptions2. ) в Microsoft.Web.WebView2.Core.CoreWebView2Environment + d__3.MoveNext () в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task) в System.Runtime.CompilerServices.TaskleNonSuiter.Home. .Tasks.Task) в System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task) в Microsoft.Web.WebView2.Wpf.WebView2 + ‹› c__DisplayClass25_0 + ‹g__Init | 0› d.MoveNext () в System.MoveNext () Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task) a t System.Runtime.CompilerServices.TaskAwaiter.GetResult () в MyWebView2Wpf.Login + d__4.MoveNext () в System.Runtime.CompilerServices.AsyncMethodBuilderCore + ‹› c.b__6_0 (System.ObjectReporting) (System.Delegate, System.Object, Int32) в System.Windows.Threading.ExceptionWrapper.TryCatchWhen (System.Object, System.Delegate, System.Object, Int32, System.Delegate) в System.Windows.Threading.DispatcherOperation.InvokeImpl () в System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext (System.Object) в MS.Internal.CulturePreservingExecutionContext.CallbackWrapper (System.Object) в System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext. , System.Object, Boolean) в System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) в System.Threading.ExecutionContext.Run (System.Threading.Execut ionContext, System.Threading.ContextCallback, System.Object) в MS.Internal.CulturePreservingExecutionContext.Run (MS.Internal.CulturePreservingExecutionContext, System.Threading.ContextCallback, System.Object) в System.Windows.ThreadingIn.DispatcherO) в System.Windows.ThreadingIn.DispatcherO). System.Windows.Threading.Dispatcher.ProcessQueue () в System. Windows.Threading.Dispatcher.WndProcHook (IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef) в MS.Win32.HwndWrapper.WndProc (IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef) в MS.SpatcherCassback (System.Winubclass. Object) в System.Windows.Threading.ExceptionWrapper.InternalRealCall (System.Delegate, System.Object, Int32) в System.Windows.Threading.ExceptionWrapper.TryCatchWhen (System.Object, System.Delegate, System.Object, Int32, System. Делегат) в System.Windows.Threading.Dispatcher.LegacyInvokeImpl (System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32) в MS.Win32.HwndSubclass.SubclassWndProc (IntPtr, Int32, IntPtr, Int32 IntPtr)
в MS.Win32.UnsafeNativeMethods.DispatchMessage (System.Windows.Interop.MSG ByRef) в System.Windows.Threading.Dispatcher.PushFrameImpl (System.Windows.Threading.DispatcherFrame) в System.Windows.Threading. Dispatcher.PushFrame (System.Windows.Threading.DispatcherFrame) в System.Win dows.Application.RunDispatcher (System.Object) в System.Windows.Application.RunInternal (System.Windows.Window) в System.Windows.Application.Run (System.Windows.Window) в System.Windows.Application.Run () в MyWebView2Wpf.App.Main () - person Yu Zhou; 26.04.2021