WebView2 在调试中工作,但在使用 ClickOnce 发布时不工作
WebView2 works in debug but not when published with ClickOnce
我在本地发布了一个 C# WPF MVVM(Caliburn Micro) 应用程序,当我尝试使用 WebView2 显示网页时出现以下事件查看器消息。网页在调试中显示正常。
Description: The process was terminated due to an unhandled exception.
Exception Info: System.DllNotFoundException: Dll was not found.
at Microsoft.Web.WebView2.Core.CoreWebView2Environment.CreateCoreWebView2EnvironmentWithOptions(String browserExecutableFolder, String userDataFolder, ICoreWebView2EnvironmentOptions options, ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler environment_created_handler)
at Microsoft.Web.WebView2.Core.CoreWebView2Environment.CreateAsync(String browserExecutableFolder, String userDataFolder, CoreWebView2EnvironmentOptions options)
at IGPC2WPF.Views.BrowserView.InitializeAsync()
我看到它与 userDataFolder 相关,并尝试了一些来自堆栈溢出的解决方案,但仍然没有成功。
我不明白的是,似乎创建了一个 EBWebView 文件夹,我认为它是 userData 文件夹,所以为什么会出错,是否存在权限问题?
WebView2Loader.dll在发布目录
EBWebView 的位置是:C:\Users*****\AppData\Local\Temp\IGPC2WPF\EBWebView
这是我的 xaml 和显示网站的文件的隐藏代码。
XAML 查看
<UserControl x:Class="IGPC2WPF.Views.BrowserView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:IGPC2WPF.Views"
xmlns:cal="http://caliburnmicro.com"
xmlns:wv2="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf"
mc:Ignorable="d" Background="#3b3b3b"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<wv2:WebView2 x:Name="WebView" Source="{Binding PdfAddress, Mode=TwoWay}" />
</Grid>
ViewModel
private string _address;
private readonly IEventAggregator _events;
private readonly IConfiguration _config;
public string Address
{
get { return _address; }
set { _address = value; NotifyOfPropertyChange(() => Address); }
}
public BrowserViewModel(IEventAggregator events, IConfiguration config)
{
_events = events;
_config = config;
_address = _config.GetValue<string>("MiscURLs:WorkToListReport");
}
public void Close()
{
_events.PublishOnUIThreadAsync(new GenerateExcelDataEvent());
TryCloseAsync();
}
隐藏代码:
public partial class BrowserView : UserControl
{
public WebPageView()
{
InitializeComponent();
InitializeAsync();
}
async void InitializeAsync()
{
string userDataFolder = Path.Combine(Path.GetTempPath(), "IGPC2WPF");
WebView.CreationProperties = new()
{
UserDataFolder = userDataFolder
};
await WebView.EnsureCoreWebView2Async(null);
}
}
编辑
好的,问题是当我在发布目录中 运行 setup.exe 时,存在的 WebView2Loader.dll 没有被复制到安装目录。如果我手动将它移动到安装位置,网页显示正常。
如何确保在 ClickOnce 中复制了此 dll?
我发现了一个类似的问题,它似乎解决了 WebView2Loader.dll 没有安装到根最终安装文件夹的问题。
在我添加的.csproj文件中:
<PropertyGroup>
<WebView2LoaderPreference>Static</WebView2LoaderPreference>
</PropertyGroup>
<ItemGroup>
<PublishFile Include="runtimes\win-x64\native\WebView2Loader.dll">
<Visible>False</Visible>
<Group>
</Group>
<TargetPath>WebView2Loader.dll</TargetPath>
<PublishState>Include</PublishState>
<IncludeHash>True</IncludeHash>
<FileType>File</FileType>
</PublishFile>
</ItemGroup>
现在,这会将所需文件复制到根目录中,并且应用程序 webview 页面可以正常工作。
我在本地发布了一个 C# WPF MVVM(Caliburn Micro) 应用程序,当我尝试使用 WebView2 显示网页时出现以下事件查看器消息。网页在调试中显示正常。
Description: The process was terminated due to an unhandled exception. Exception Info: System.DllNotFoundException: Dll was not found. at Microsoft.Web.WebView2.Core.CoreWebView2Environment.CreateCoreWebView2EnvironmentWithOptions(String browserExecutableFolder, String userDataFolder, ICoreWebView2EnvironmentOptions options, ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler environment_created_handler) at Microsoft.Web.WebView2.Core.CoreWebView2Environment.CreateAsync(String browserExecutableFolder, String userDataFolder, CoreWebView2EnvironmentOptions options) at IGPC2WPF.Views.BrowserView.InitializeAsync()
我看到它与 userDataFolder 相关,并尝试了一些来自堆栈溢出的解决方案,但仍然没有成功。
我不明白的是,似乎创建了一个 EBWebView 文件夹,我认为它是 userData 文件夹,所以为什么会出错,是否存在权限问题?
WebView2Loader.dll在发布目录
EBWebView 的位置是:C:\Users*****\AppData\Local\Temp\IGPC2WPF\EBWebView
这是我的 xaml 和显示网站的文件的隐藏代码。
XAML 查看
<UserControl x:Class="IGPC2WPF.Views.BrowserView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:IGPC2WPF.Views"
xmlns:cal="http://caliburnmicro.com"
xmlns:wv2="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf"
mc:Ignorable="d" Background="#3b3b3b"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<wv2:WebView2 x:Name="WebView" Source="{Binding PdfAddress, Mode=TwoWay}" />
</Grid>
ViewModel
private string _address;
private readonly IEventAggregator _events;
private readonly IConfiguration _config;
public string Address
{
get { return _address; }
set { _address = value; NotifyOfPropertyChange(() => Address); }
}
public BrowserViewModel(IEventAggregator events, IConfiguration config)
{
_events = events;
_config = config;
_address = _config.GetValue<string>("MiscURLs:WorkToListReport");
}
public void Close()
{
_events.PublishOnUIThreadAsync(new GenerateExcelDataEvent());
TryCloseAsync();
}
隐藏代码:
public partial class BrowserView : UserControl
{
public WebPageView()
{
InitializeComponent();
InitializeAsync();
}
async void InitializeAsync()
{
string userDataFolder = Path.Combine(Path.GetTempPath(), "IGPC2WPF");
WebView.CreationProperties = new()
{
UserDataFolder = userDataFolder
};
await WebView.EnsureCoreWebView2Async(null);
}
}
编辑 好的,问题是当我在发布目录中 运行 setup.exe 时,存在的 WebView2Loader.dll 没有被复制到安装目录。如果我手动将它移动到安装位置,网页显示正常。
如何确保在 ClickOnce 中复制了此 dll?
我发现了一个类似的问题,它似乎解决了 WebView2Loader.dll 没有安装到根最终安装文件夹的问题。
在我添加的.csproj文件中:
<PropertyGroup>
<WebView2LoaderPreference>Static</WebView2LoaderPreference>
</PropertyGroup>
<ItemGroup>
<PublishFile Include="runtimes\win-x64\native\WebView2Loader.dll">
<Visible>False</Visible>
<Group>
</Group>
<TargetPath>WebView2Loader.dll</TargetPath>
<PublishState>Include</PublishState>
<IncludeHash>True</IncludeHash>
<FileType>File</FileType>
</PublishFile>
</ItemGroup>
现在,这会将所需文件复制到根目录中,并且应用程序 webview 页面可以正常工作。