Windows端WebView2如何加载应用当前目录下的本地HTML文件
WebView2加载本地同目录HTML文件解决方案
问题根源
你原有代码无法正常运行的核心原因如下:
Directory.GetCurrentDirectory()获取的是进程工作目录,不等于应用程序程序集所在目录,当程序被第三方调用、用快捷方式启动时,工作目录会发生变化,无法稳定定位到exe所在目录- WebView2的
CoreWebView2需要完成初始化后才能调用导航相关方法,你直接判断CoreWebView2 != null大概率返回false,所以你写的加载逻辑根本没有执行,才会出现空白页面、F12无法呼出的问题 - 同时调用
NavigateToString和设置Source属于重复操作,会互相覆盖 - 直接用字符串拼接路径存在转义符兼容问题,应该用系统提供的路径拼接方法处理
正确实现步骤
1. 等待WebView2初始化完成
不要在Form构造或Load事件中直接执行导航逻辑,需要先确认CoreWebView2初始化完成后再操作。
2. 正确获取应用程序所在目录
用AppContext.BaseDirectory获取程序集所在的根目录,该路径永远指向exe所在文件夹,不受工作目录变化影响。
3. 生成标准File协议URI
本地文件需要转换成file://格式的URI传给WebView2,不要直接传文件系统路径。
完整可运行代码示例
替换你Form1.cs中的逻辑即可:
using Microsoft.Web.WebView2.WinForms; using System.IO; public partial class Form1 : Form { public Form1() { InitializeComponent(); // 订阅初始化完成事件 webView.CoreWebView2InitializationCompleted += WebView_CoreWebView2InitializationCompleted; // 触发WebView2初始化,不需要在属性面板设置Source _ = InitializeWebView(); } private async Task InitializeWebView() { // 等待CoreWebView2初始化完成 await webView.EnsureCoreWebView2Async(); // 开启F12开发者工具权限 webView.CoreWebView2.Settings.AreDevToolsEnabled = true; } private void WebView_CoreWebView2InitializationCompleted(object? sender, CoreWebView2InitializationCompletedEventArgs e) { if (!e.IsSuccess) return; // 获取exe所在目录 string appRoot = AppContext.BaseDirectory; // 拼接HTML文件路径,自动兼容各种路径格式 string htmlPath = Path.Combine(appRoot, "main.html"); // 转换成标准File协议URI Uri htmlUri = new Uri(htmlPath); // 加载本地HTML webView.CoreWebView2.Navigate(htmlUri.ToString()); } }
额外配置
把项目中的main.html文件选中,在属性面板设置「复制到输出目录」为「如果较新则复制」,编译时会自动把HTML文件拷贝到exe所在目录,无需手动复制。
该方案会自动加载HTML中引用的相对路径CSS、JS、图片等资源,比NavigateToString方案更稳定。
内容的提问来源于stack exchange,提问作者Anthony LoPrimo
相关产品推荐
相关产品推荐

