【发布时间】:2020-09-12 19:38:10
【问题描述】:
我使用 VS 2017 安装程序创建了一个 winform 应用程序的安装文件。当我在我的电脑上测试这个设置文件时,登录运行良好。所以我在其他电脑上运行这个安装文件。
但是,当我在这些 PC 上登录应用程序时,应用程序说“对象引用未设置为对象的实例”,尽管我确信数据库中的用户名和密码是正确的。
我见过What is a NullReferenceException, and how do I fix it?,但我不认为这是空异常,因为安装的应用程序没有在我的电脑中抛出上述错误。仅当我在其他 PC 上安装该应用程序时才会出现此错误。
我还尝试将其他 PC 中已安装应用程序文件夹中的 .exe 和 .config 文件替换为我 PC 中应用程序的相同文件(效果很好),并且应用程序运行正常。但后来我重新启动那些电脑,并尝试登录应用程序,同样的错误发生了。
这是登录代码。我相信我已经正确检查了 null 异常。我说的对吗?
private void btnLogin_Click(object sender, EventArgs e)
{
try
{
var info = UsersBiz.Login(txtUserName.Text.Trim(), txtPassWord.Text);
if (info != null && info.user.Id > 0)
{
Constants.USERINFO = info;
this.Hide();
var frm = new frmMain();
frm.Show();
if (ckbRemember.Checked)
{
ManagementInventory.Properties.Settings.Default.User = txtUserName.Text;
ManagementInventory.Properties.Settings.Default.Pass = txtPassWord.Text;
ManagementInventory.Properties.Settings.Default.Save();
}
}
else
{
MessageBox.Show("UserName or Password not correct!");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
【问题讨论】:
-
“但我不认为它是空异常” - 除了自己故意抛出这个异常之外,它的原因只有一个:某些东西是空的。在您的情况下,这意味着其中之一为空:
UsersBiz(如果不是静态的)、txtUserName、txtUserName.Text、txtPassword、info、info.user、chkbRemember、ManagementInventory、ManagementInventory.Properties,或ManagementInventory.Settings,ManagementInventory.Properties.Settings.Default。 -
因为它是 WinForms,我希望 UI 组件已经分配了值,并且这些组件中的文本在最坏的情况下是一个空字符串。对我来说,上面代码中的可能可能性是
info.user为空,或者ManagementInventory.Properties.Settings.Default链中的某些东西是null。我想知道您的设置文件是否有问题(不存在或不在正确的目录中)。您要查找的文件与您的程序文件名相同(例如app.exe),但附加了.config:app.exe.config -
此类问题是大多数程序执行某种日志记录的原因。作为一种快速解决方案,您可以将
MessageBox.Show(ex.Message)替换为MessageBox.Show(ex.ToString());然后您可以看到引发异常的确切位置,包括调用堆栈。 -
我试过
MessageBox.Show(ex.ToString()),它指向UserBiz.Login方法中的GetConnectionString方法(连接数据库)。我会看看GetConnectionString方法或app.config中的ConnectionString是否有问题。奇怪的是,如果我从计算机中的应用程序文件夹中复制app.exe和app.exe.config(运行良好)并粘贴到该应用程序无法运行的计算中,该应用程序将运行良好,直到我重新启动该计算机(问题再次出现) .谢谢你的建议。 -
See this answer for some ideas。您一定缺少运行时或类似的东西。或许请参阅“通用技巧?” 部分。
标签: c# winforms windows-installer