WPF C # Проверьте, существуют ли необходимые файлы при запуске приложения - PullRequest
0 голосов
/ 29 января 2019

Я хочу проверить, существуют ли файлы .dll, .png и .exe перед запуском первого окна приложения, но проблема в том, что я не могу, как бы я ни пытался, просто выдает ошибку в окне просмотра событий, вместо моего сообщения.

Мой метод IsResourceExist:

private static bool IsResourceExist(string fileName)
{
            var process = Process.GetCurrentProcess();
            string path = process.MainModule.FileName.Replace("\\" + process.ProcessName + ".exe", "");
            try
            {
                if (!File.Exists(Path.Combine(path, fileName)))
                {
                    MessageBox.Show("Unable to load " + fileName + " library\nReinstall application and try again", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                    return false;
                }
                return true;
            }
            catch
            {
                return false;
            }
        }

Простой метод, ничего необычного, в нормальной ситуации (когда файл действительно существует, работает нормально)

private static bool CheckLibrarys()
        {
            if (!IsResourceExist("MyLib.dll")) return false;
            //Other resources checking same way
            return true;
        }

Этот метод проверяет все ресурсы, необходимые приложениям, также работаетв нормальной ситуации (когда все файлы существуют)

Я думаю, что самая первая строка кода, вызываемая приложением, работает, когда файлы существуют

public App()
        {
            if (!CheckLibrarys()) Environment.Exit(0);
        }

Когда я удаляю файл MyLib.dll в программе просмотра событий, онthrows:

Описание: процесс был прерван из-за необработанного исключения.Информация об исключении: System.IO.FileNotFoundException в myapp.App.CheckLibrarys () в myapp.App..ctor () в myapp.App.Main ()

На самом деле это что-то вроде.Net Framework шутка?Чего мне здесь не хватает?

РЕДАКТИРОВАТЬ 1: Та же ситуация, даже с переопределением OnStartup

protected override void OnStartup(StartupEventArgs e)
{      
     if (!CheckLibrarys()) Environment.Exit(0);
     base.OnStartup(e);
 }

РЕДАКТИРОВАТЬ 2, расширяя @bic ответ, и все равно приложение не запускается и не выдает никакой ошибки, котораяmylib isssing

 private static bool CheckLibrarys()
        {
            if (!IsResourceExist("MyLib.dll")) { return false; }
            else
            {
                if (!MyLib.Init.ReturnOnlyTrue())
                {
                    MessageBox.Show("Wrong loaded library, reinstall application and try again", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                    return false;
                }
            }
            //Other resources checking same way
            return true;
        }

В моем классе MyLib Init метод ReturnOnlyTrue () выглядит следующим образом:

public static bool ReturnOnlyTrue()
        {
            return true;
        }

Ответы [ 2 ]

0 голосов
/ 29 января 2019

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

Вот хорошее описание того, как среда выполнения разрешает ссылки.В конечном счете, это и есть исключение FileNotFound.https://docs.microsoft.com/en-us/dotnet/framework/deployment/how-the-runtime-locates-assemblies

Чтобы зафиксировать ошибку при запуске приложения, вы можете добавить обработку ошибок следующим образом.

namespace SO_Wpf
{
    using System;
    using System.Diagnostics;
    using System.IO;
    using System.Windows;
    using System.Windows.Threading;

    public partial class App : Application
    {
        public App()
        {
            Current.DispatcherUnhandledException += this.AppDispatcherUnhandledException;
            AppDomain.CurrentDomain.UnhandledException += this.AppDomainUnhandledException;
        }

        private void AppDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
        {
            if (e.Exception.GetType() == typeof(FileNotFoundException))
            {
                if (!CheckLibrarys())
                {
                    Current.Shutdown();
                }
            }
            else
            {
                MessageBox.Show(e.Exception.Message);
            }
        }

        private void AppDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            if (e.ExceptionObject.GetType() == typeof(FileNotFoundException))
            {
                if (!CheckLibrarys())
                {
                    Current.Shutdown();
                }
            }
            else
            {
                MessageBox.Show(e.ExceptionObject.ToString());
            }
        }

        private static bool CheckLibrarys()
        {
            if (!IsResourceExist("MyLib.dll"))
            {
                return false;
            }

            //Other resources checking same way
            return true;
        }

        private static bool IsResourceExist(string fileName)
        {
            var process = Process.GetCurrentProcess();
            var path = process.MainModule.FileName.Replace("\\" + process.ProcessName + ".exe", "");
            try
            {
                if (!File.Exists(Path.Combine(path, fileName)))
                {
                    MessageBox.Show("Unable to load " + fileName + " library\nReinstall application and try again", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                    return false;
                }

                return true;
            }
            catch
            {
                return false;
            }
        }
    }
}

e.Exception.Message выдаст вам сообщение или выможет полностью изменить вывод, проверив ошибку, и если ее FileNotFoundException и т. д. сообщит пользователю и выйдет.

0 голосов
/ 29 января 2019

Вы можете переопределить OnStartup метод App.xaml.В этом вы можете добавить свою собственную логику.

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

public partial class App : Application
{
    public App()
    {
        DispatcherUnhandledException += App_DispatcherUnhandledException;
    }

    private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
    {
        e.Handled = true;
        MessageBox.Show(e.Exception.Message);
        Environment.Exit(0);
    }

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        if (!SomeCondition)
            Application.Current.Shutdown();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...