WinForms工具WebBrowser转WebView2遇空引用错误求助
问题分析与解决
错误根源
你遇到的「对象引用未设置到对象实例」错误,核心原因是WebView2的CoreWebView2对象还没完成初始化就被调用。WebView2和旧WebBrowser组件逻辑不同,它需要先完成核心运行环境的初始化,CoreWebView2属性才会被实例化,直接调用会触发空引用异常。
另外,你的新代码把原逻辑的POST请求改成了GET参数拼接,偏离了原本的业务逻辑,需要同步修正。
修正后的代码示例
方式1:异步初始化(推荐)
public async void SubmitData(string link = "") { WebView2 wb2 = new WebView2(); // 先确保CoreWebView2完成初始化 await wb2.EnsureCoreWebView2Async(); try { if (!string.IsNullOrEmpty(link)) { wb2.CoreWebView2.Navigate(link); } else { string postdata = "portfolio=" + ControlHelper.SerializeXMLString(pf); System.Text.Encoding encod = System.Text.Encoding.UTF8; byte[] bytVal = encod.GetBytes(postdata); // 构造POST请求,对齐原WebBrowser的逻辑 var request = wb2.CoreWebView2.Environment.CreateWebResourceRequest( "http://lt.morningstar.com/4uzvsjb3c3/xray/default.aspx", "POST", bytVal, "Content-Type: application/x-www-form-urlencoded" ); wb2.CoreWebView2.NavigateWithWebResourceRequest(request); } wb2.Show(); } catch (Exception ex) { FileLogger.HandleError("Submit caused an error!", true, true, "Error (Main, SubmitData): " + ex.Message, GlobalData._TempPath, GlobalData._logfile); } finally { // 动态创建的控件建议先添加到窗体Controls再Dispose,避免资源泄漏 wb2.Dispose(); } }
方式2:初始化完成事件回调(非异步场景)
如果项目无法使用异步方法,可通过监听事件处理:
public void SubmitData(string link = "") { WebView2 wb2 = new WebView2(); // 绑定初始化完成事件 wb2.CoreWebView2InitializationCompleted += (sender, e) => { if (e.IsSuccess) { try { if (!string.IsNullOrEmpty(link)) { wb2.CoreWebView2.Navigate(link); } else { string postdata = "portfolio=" + ControlHelper.SerializeXMLString(pf); System.Text.Encoding encod = System.Text.Encoding.UTF8; byte[] bytVal = encod.GetBytes(postdata); var request = wb2.CoreWebView2.Environment.CreateWebResourceRequest( "http://lt.morningstar.com/4uzvsjb3c3/xray/default.aspx", "POST", bytVal, "Content-Type: application/x-www-form-urlencoded" ); wb2.CoreWebView2.NavigateWithWebResourceRequest(request); } wb2.Show(); } catch (Exception ex) { FileLogger.HandleError("Submit caused an error!", true, true, "Error (Main, SubmitData): " + ex.Message, GlobalData._TempPath, GlobalData._logfile); } } else { // 处理初始化失败的情况 FileLogger.HandleError("WebView2 initialization failed!", true, true, "Error: " + e.InitializationException.Message, GlobalData._TempPath, GlobalData._logfile); } }; // 触发初始化,不指定路径则使用系统默认安装的Edge运行时 wb2.EnsureCoreWebView2Async(null); // 将控件添加到窗体Controls集合,否则可能无法正常显示 this.Controls.Add(wb2); wb2.Dock = DockStyle.Fill; // 根据需求调整布局 }
关键注意点
- CoreWebView2初始化:必须等待初始化完成后才能调用其方法,这是WebView2和WebBrowser最核心的差异。
- POST请求适配:WebView2没有WebBrowser那样直接带POST数据的
Navigate重载,需通过CreateWebResourceRequest构造请求后发送。 - 控件生命周期:动态创建的WebView2需添加到窗体
Controls集合,避免显示异常和资源泄漏。
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

