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

.NET Core 3.1 WinForms程序仅目标机报‘未将对象引用设置到实例’

问题描述

我开发了基于.NET Core 3.1的C# Windows Forms应用,编译无错误且在开发机运行正常,但发布到其他机器时出现“未将对象引用设置到实例”异常,异常指向Program_Form_Load方法的第98行。该行代码调用Load_Data_ToCombobox方法,已尝试更新Visual Studio、清理%appdata%文件等操作,仍无法定位原因。

相关代码如下:

Form加载方法代码:

private void Program_Form_Load(object sender, EventArgs e)
{
    // MULTIPLE LINES 
    Load_Data.Load_To_CMBB_ Ldt = new Load_Data.Load_To_CMBB_();
    Ldt.Load_Data_ToCombobox(dataGridView4, 0, Fabricant);
    // MULTIPLE LINES 
}

调用的方法代码:

public void Load_Data_ToCombobox(DataGridView dgw, int Row, ComboBox cmb)
{
    string val = null;
    List<string> l = new List<string>();
    l.Clear();

    for (int i = 0; i <= dgw.Rows.Count - 1; i++)
    {
        if (dgw[Row, i].Value != null)
        {
            val = dgw[Row, i].Value.ToString();

            if (!l.Exists(x => x == val)) 
            { 
                l.Add(val); 
                cmb.Items.Add(val); 
            }
        }
    }

    cmb.SelectedIndex = cmb.Items.Count - 1;
}
排查与解决思路
  • 检查传入控件的实例有效性
    发布后其他机器上,dataGridView4或Fabricant(ComboBox)可能未正确初始化。建议在调用方法前增加空判断,避免空引用:

    if (dataGridView4 != null && Fabricant != null)
    {
        Load_Data.Load_To_CMBB_ Ldt = new Load_Data.Load_To_CMBB_();
        Ldt.Load_Data_ToCombobox(dataGridView4, 0, Fabricant);
    }
    

    同时确认窗体控件的Name属性与代码中引用的名称完全一致,避免发布时控件绑定失败。

  • 验证列索引的合法性
    代码中传入的Row参数为0,需确保dataGridView4在目标机器上存在索引为0的列。如果列数不足,dgw[Row, i]会触发空引用异常。可以在方法开头增加索引校验:

    public void Load_Data_ToCombobox(DataGridView dgw, int columnIndex, ComboBox cmb)
    {
        if (dgw == null || cmb == null) return;
        if (columnIndex < 0 || columnIndex >= dgw.Columns.Count) return;
        // 原有逻辑代码
    }
    
  • 处理DataGridView的空数据与新行
    如果目标机器上dataGridView4没有有效行数据,或者包含默认的空新行,可能导致异常。可以在循环中跳过新行:

    for (int i = 0; i < dgw.Rows.Count; i++)
    {
        if (dgw.Rows[i].IsNewRow) continue; // 跳过未提交的新行
        if (dgw[columnIndex, i].Value != null)
        {
            // 原有逻辑代码
        }
    }
    
  • 检查Load_To_CMBB_类的构造依赖
    若Load_Data.Load_To_CMBB_的构造函数依赖开发机特有的资源(如本地文件、注册表项、未部署的依赖库),在目标机器上实例化会失败,导致Ldt为空。需检查该类构造函数代码,确保所有依赖都已打包到发布文件中。

  • 添加异常捕获与详细日志
    在调用方法处增加异常捕获,记录完整的异常信息(包括堆栈跟踪和内部异常),帮助精准定位问题:

    private void Program_Form_Load(object sender, EventArgs e)
    {
        // MULTIPLE LINES 
        try
        {
            Load_Data.Load_To_CMBB_ Ldt = new Load_Data.Load_To_CMBB_();
            Ldt.Load_Data_ToCombobox(dataGridView4, 0, Fabricant);
        }
        catch (Exception ex)
        {
            MessageBox.Show($"异常信息:{ex.Message}\n堆栈跟踪:{ex.StackTrace}\n内部异常:{ex.InnerException?.Message}");
            // 也可写入本地日志文件
        }
        // MULTIPLE LINES 
    }
    

内容的提问来源于stack exchange,提问作者Stoica Vasile

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:44:17