.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

