Как исправить исключение NullReferenceException, возникающее только на некоторых компьютерах - PullRequest
0 голосов
/ 26 мая 2020

Я создаю установочный файл приложения winform с помощью установщика VS 2017. Когда я тестирую этот установочный файл на своем P C, вход в систему выполняется нормально. Поэтому я запускаю этот установочный файл на других компьютерах.

Однако, когда я вхожу в приложение на этих ПК, приложение говорит: «Ссылка на объект не установлена ​​для экземпляра объекта», хотя я уверен, что имя пользователя и пароль были правильными в базе данных.

Я видел Что такое NullReferenceException и как его исправить? , но я не думаю, что это нулевое исключение, потому что установленное приложение не вызывало вышеуказанную ошибку в моем P C. Эта ошибка возникает только тогда, когда я устанавливаю приложение на другие ПК.

Я также пытаюсь заменить файлы .exe и .config в папке установленного приложения на других ПК теми же файлами приложения в моем P C (что хорошо работает), и приложение работает нормально. Но затем я перезагружаю эти компьютеры и пытаюсь войти в приложение, происходит та же ошибка.

Это код для входа. Я считаю, что правильно проверил нулевое исключение. Я прав?

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);
        }

1 Ответ

0 голосов
/ 26 мая 2020

Самый простой способ - использовать отладчик Visual Studio на компьютере, на котором выполняется программа. Если на этом компьютере нет Visual Studio, рассмотрите возможность удаления отладки. См. , как начать отладку на удаленном компьютере.

Если по соображениям безопасности удаленная отладка исключена, рассмотрите возможность регистрации исключения, особенно трассировки стека. Если вы знаете, где это происходит, просто окружите его символом try-catch

try
{
    // Here are the statements that cause your ArgumentNullException
}
catch (ArgumentNullException exc)
{
    // log the exception
}

. Если ваша программа не имеет возможности ведения журнала, подумайте о добавлении чего-то вроде NLOG. Другой вариант - добавить его в текстовый файл.

void WriteExceptionToTextFile(Exception exc, string fileName)
{
    using (var writer = File.AppendText(fileName))
    {
        writer.WriteLine("Exception {0}", exc.GetType());
        write.WriteLine("Stack trace" + exc.StackTrace);
        ... // etc
    }
}

Если вы не знаете, где возникает исключение, вы не можете попытаться его поймать. В этом случае подумайте о том, чтобы перехватить необработанное исключение и зарегистрировать его:

См.: перехват необработанного исключения

В ваших формах программа находится в файле program.cs, который содержит основной :

public static void Main()
{
    AppDomain currentDomain = AppDomain.CurrentDomain;
    currentDomain.UnhandledException += OnUnhandledException;
    ...
}

static void OnUnhandledException(object sender, UnhandledExceptionEventArgs args)
{
    Exception undhandledException = (Exception) args.ExceptionObject;
    // TODO log the unhandled exception

}

...