You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 17:01:12