Развертывание приложения WPF - проблема с запуском приложения на другом ПК - PullRequest
0 голосов
/ 13 июня 2011

All

У меня есть приложение WPF, построенное на базе данных SQLite и настройках конфигурации пользователя / приложения. Приложение собирается и отлично работает в среде разработки. Я создал проект установки и развертывания, добавил «Выходные данные проекта» вышеупомянутого приложения и затем приступил к созданию установки. Предварительные требования и версии .NET Framework одинаковы в приложении и в проекте установки:

.NET Framework 3.5 Профиль клиента MS Visual Basic Powerpacks 10.0.0 Установщик Windows 3.1

Но когда я перемещаю его на другой компьютер с идентичным установленным .NET Framework (но без среды разработки), приложение не запускается. Выдает ошибку «возникла проблема, и ее необходимо закрыть». Я обнаружил, что это будет означать необъяснимое исключение в приложении. Итак, я попытался закомментировать части приложения, в которых они не обрабатывались, и оставил все, кроме одного окна, для отображения (главное окно, которое ничего не делает), но приложение не работает. Я начинаю подозревать, что проблема может заключаться в том, что зависимости не обрабатываются для запуска приложения. Вот что я с ними сделал:

  1. SQLite требовалась библиотека DLL, которая автоматически добавлялась в «Обнаруженные зависимости» и копировалась в каталог приложений.
  2. Базы данных SQLite добавляются в проект вручную и копируются в каталог приложений
  3. Файлы Application.exe.config НЕ копируются. Я не уверен, где их поставить

На данный момент, я хотел бы знать, как я могу найти причину проблемы. Я попытался запустить другое простое приложение с одним окном (и без функциональности), и оно работает на целевой машине. ТИА

Ответы [ 3 ]

1 голос
/ 13 июня 2011

Если вы считаете, что проблема заключается в зависимостях, то, возможно, стоит взглянуть на «Средство просмотра журнала привязки сборки» (т.е. fuslogvw.exe).Этот инструмент должен быть в состоянии точно сказать, какие сборки были запрошены и как были выполнены запросы или не выполнены.Уловка в том, что это работает только для управляемых сборок.

Если, однако, вы хотите выяснить, что такое необработанное исключение, вы можете обернуть попытку ... поймать точку входа приложения.Подвох в WPF заключается в том, что он генерируется компилятором / Visual Studio, поэтому вы не можете его изменить.Если вы хотите изменить его, скажем, чтобы попытаться ... поймать его, тогда вам нужно (пример взят из http://www.infosysblogs.com/microsoft/2008/09/how_to_write_custom_main_metho.html):

  1. Найти файлы App.xaml и App.xaml.cs
  2. Откройте страницу свойств для App.xaml и измените действие построения на «Страница»
  3. В App.xaml.cs добавьте метод Main (), который должен выглядеть следующим образом:

    [STAThread]
    public static void Main()
    {
        var app = new App();
        app.InitializeComponent();
        app.Run();
    }
    

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

===== РЕДАКТИРОВАТЬ =====

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

<!-- language: lang-cs -->

    [STAThread]
    public static void Main()
    {
        try
        {
            MyMethod();
        }
        catch(Exception e)
        {
            // ... Write to file here
        }
    }

    private static void MyMethod()
    {
        // .. Do actual work here
    }

Делая это, вы убедитесь, что находитесь внутри попытки.поймать конструкцию до того, как среда выполнения попытается найти нужные сборки и т. д. Однако неНапример, есть некоторые исключения, которые не могут быть перехвачены (OutOfMemoryException, StackOverflowException и некоторые другие).

0 голосов
/ 06 ноября 2011

Проблема также возникает, если вы изменили пространство имен App.xaml.cs, но не App.xaml. Как только вы добавите приведенный выше код, вы узнаете, что вызов InitializeComponent () не скомпилируется.

0 голосов
/ 13 июня 2011

Рассматривали ли вы вариант развертывания ClickOnce для своего приложения?

Как видно из этого SO вопроса , должно быть возможно связать вашу базу данных SQLite с приложением ClickOnce . Вы получите другие преимущества (если вы заинтересованы), такие как автоматические обновления.

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