WPF 的 Webview2 控件在目标机器上不起作用

Webview2 control for WPF does not work on target machine

我有一个 wpf WebView2 控件可以在开发机器上运行但不能在目标机器上运行,也不会抛出任何错误,控件只是空白。它是一个 wpf net 5 项目。 Microsoft.Web.WebView2 1.0.818.41

WebView2 控件在 xaml 中声明为

<wv2:WebView2 Name="WebBrowser" Grid.Row="1"  Source="https://www.microsoft.com"/>

在代码中调用:

public void LoadAddress(string webaddress)
{
    try
    {
        WebBrowser.Source=new Uri(webaddress);
    }
    catch(Exception e)
    {
        MessageBox.Show(e.Message);
    }
}

初始化为

var env = await CoreWebView2Environment.CreateAsync(userDataFolder: WorkingDirectory);

目标机器安装了 WebView2 运行时。

在目标机器上调用 LoadAddress 时没有任何反应,没有错误,控件是空白的。

我使用一个函数来检查版本,returns目标机器上的正确版本

version = typeof(CoreWebView2Environment).Assembly.GetName().Version;

我正在使用 Visual Studio 安装程序构建安装程序,这包括

"Microsoft.Web.WebView2": 依赖项中的“1.0.818.41”

  "Microsoft.Web.WebView2/1.0.818.41": {
    "runtime": {
      "lib/netcoreapp3.0/Microsoft.Web.WebView2.Core.dll": {
        "assemblyVersion": "1.0.818.41",
        "fileVersion": "1.0.818.41"
      },
      "lib/netcoreapp3.0/Microsoft.Web.WebView2.WinForms.dll": {
        "assemblyVersion": "1.0.818.41",
        "fileVersion": "1.0.818.41"
      },
      "lib/netcoreapp3.0/Microsoft.Web.WebView2.Wpf.dll": {
        "assemblyVersion": "1.0.818.41",
        "fileVersion": "1.0.818.41"
      }
    },
    "runtimeTargets": {
      "runtimes/win-arm64/native/WebView2Loader.dll": {
        "rid": "win-arm64",
        "assetType": "native",
        "fileVersion": "1.0.818.41"
      },
      "runtimes/win-x64/native/WebView2Loader.dll": {
        "rid": "win-x64",
        "assetType": "native",
        "fileVersion": "1.0.818.41"
      },
      "runtimes/win-x86/native/WebView2Loader.dll": {
        "rid": "win-x86",
        "assetType": "native",
        "fileVersion": "1.0.818.41"
      }
    }
  }

任何见解都会有所帮助。谢谢

我进行了一些更改并使其正常运行。 该应用程序正在安装到目标机器程序文件文件夹,该文件夹在普通用户模式下是只读的。

WebView2 尝试在那里创建本地文件夹但失败了。 为克服此问题,您必须为 WebView2 本地文件夹指定另一个位置,用户将从该应用程序获得读写访问权限。

首先确保webview2控件的xaml声明中没有Source:

<wv2:WebView2 Name="WebBrowser" Grid.Row="1"/>

因为声明 Source 会先实例化控件,然后才能对其进行处理。

然后在 window 或类似这样的控件的 InitializeComponent 之后创建一个初始化方法

public async void InitializeWebView()
        {
            try
            {
                var env = await CoreWebView2Environment.CreateAsync(null,"C:\Temp");
                await TopicWebBrowser.EnsureCoreWebView2Async(env);
                TopicWebBrowser.Source = new Uri("https://www.google.com");
            }
            catch(Exception e)
            {
                MessageBox.Show(" Error in Web View "+e.Message, "Application");
            }
        }