Custom Main () в WPF-приложении работает на одном компьютере, InvalidOperation и IOException на другом - PullRequest
1 голос
/ 05 января 2020

У меня есть WPF-приложение с 3 файлами xaml: App.xaml, StartWindow.xaml и MainWindow.xaml. Если я запускаю приложение, я хочу показать StartWindow или MainWindow в зависимости от условия. Мое решение состоит в том, чтобы написать собственный метод Main в App.xaml.cs:

public static String DEBUG = "true";

[STAThread]
static void Main()
{
    App app = new App();
    if (/*condition*/)
        app.Run(new MainWindow());
    else
        app.Run(new StartWindow());
}

Действие сборки свойства App.xaml установлено на «Страница». (Я следовал этому руководству: Руководство , хотя оно по-прежнему работает с StartupUri, установленным в "MainWindow.xaml" и без App ()).

Конструктор StartWindow имеет следующий код:

public StartWindow()
{
    InitializeComponent();

    Task.Run(() =>
    {

        // Some initialization code
        Console.WriteLine(App.DEBUG);

        Application.Current.Dispatcher.Invoke(() =>
        {
            MainWindow mainWindow = new MainWindow();
            mainWindow.Show();
            this.Close();
        });
    });
}

Это прекрасно работает на моей машине для разработки, но не на другой (Виртуальная машина с той же ОС и целевой .NetFramework установлена). Если я устанавливаю точку останова после Console.WriteLine (App.DEBUG), она выводит строку в обеих средах, но свойства выглядят по-разному, а также вскоре после этого выдает исключение:

Свойства точки останова:

Properties

Исключение (в тексте сказано, что "не удается найти ресурс" главное окно. xml ""):

Exception

Свойства точки останова на моей машине разработки, где она работает:

Working

Почему он все еще ищет MainWindow . xml, или даже stanger mainwindow.xaml? И почему только на одной машине?

1 Ответ

0 голосов
/ 06 января 2020

Я понял это:

В части кода // Some initialization code есть проверка для заданного значения c в файле конфигурации. Значение уже было правильно установлено на моей машине для разработки, и в этом случае программе не нужно было выполнять операцию записи в файл, чтобы исправить значение. На другом компьютере это значение было неверным (это путь к файлу). Программа, чем пытался записать в этот файл. Файл находится в C: \ ProgramData \ PROGRAMNAME \, где, по-видимому, запись не была разрешена. Это привело к исключению, и конструктор не завершил работу должным образом.

Теперь я храню файлы в .. \ AppData \ Local \ PROGRAMNAME

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