Развертывание приложения C# Windows Forms

Я пытаюсь создать простое устанавливаемое приложение формы с помощью Visual Studio Community 2015.

Я выполнил это пошаговое руководство: https://msdn.microsoft.com/library/k3bb4tfd%28v=vs.100%29.aspx

Поскольку шаблонов проекта установки изначально не было, я использовал https://visualstudiogallery.msdn.microsoft.com/f1cc3f3e-c300-40a7-8797-c509fb8933b9, чтобы добавить их.

Я могу успешно сделать установщик, а также успешно установить приложение. Однако, когда я пытаюсь запустить приложение (переходя в его установленную папку), проводник Windows просто сидит там, как будто пытается что-то сделать, но никогда не делает. В итоге мне нужно перезагрузить компьютер, чтобы отменить этот процесс, который никогда не запускается.

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

Я уже видел подобное поведение новых программ для разработки (https://github.com/Storj/driveshare-gui/releases), но не будет знать, обязательно ли проблемы связаны между собой.

Само приложение работает нормально при отладке Visual Studio. Я использовал шаблон Visual C# «Приложение Windows Forms» для создания исходного приложения.

Пожалуйста, дайте мне знать, если есть что-то, что вам нужно увидеть, я не знаю.

Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Parking_Variable_Editor {
    static class Program {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
    }
}

Конструктор и загрузка из MainForm.cs (единственная форма в проекте)

public MainForm() {
    InitializeComponent();
}
private void onShown(object sender, EventArgs e) {
    refreshForm();
}

Обновление:

Я запустил проект без отладки. Я сделал это, вместо этого обновив форму, когда она отображается, поскольку onLoad, казалось, пытался сделать это до того, как все было инициализировано. Однако теперь та же проблема возникает только для установленного приложения.


person Snappawapa    schedule 22.12.2015    source источник
comment
Если приложение не работает должным образом, когда вы запускаете его из каталога bin, то совершенно бессмысленно надеяться, что оно станет лучше после того, как вы создадите для него установщик. В этом вопросе нет ни малейшей важной информации, которая могла бы помочь вам.   -  person Hans Passant    schedule 22.12.2015
comment
Что будет актуально и полезно? @ХансПассант   -  person Snappawapa    schedule 22.12.2015
comment
stackoverflow.com/help/mcve   -  person Hans Passant    schedule 22.12.2015
comment
@Snappawapa refreshForm(), вероятно, является проблемой. Смотрите мои комментарии к моему ответу.   -  person raddevus    schedule 22.12.2015


Ответы (3)


Я видел эту проблему раньше, и другие тоже: Приложение C# работает с отладкой, но не без нее

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

  1. Посмотрите в конструкторе вашей основной формы Windows.
  2. Посмотрите в OnLoad вашей формы Windows.
  3. Установите точку останова в файле Program.cs, где создается ваша основная форма, а затем перейдите к коду формы — запустите с помощью F5 в Visual Studio, чтобы запустить отладочную копию.
  4. Опубликуйте код из вашего Program.cs и вашего основного конструктора формы и методов OnLoad, чтобы мы могли его увидеть.

Изменить:

Код RefreshForm(), скорее всего, является проблемой на 99%. Нужно увидеть этот код, но я держу пари, что если вы закомментируете эту строку, приложение запустится.

person raddevus    schedule 22.12.2015
comment
Спасибо за конструктивный ответ, я разместил запрошенный код и попытался выполнить отладку с помощью точки останова. Я не заметил ничего необычного. - person Snappawapa; 22.12.2015
comment
Итак, RefreshForm() с вероятностью 99% будет проблемой. Вы делаете что-то там еще до того, как форма будет построена. Пожалуйста, опубликуйте этот код или закомментируйте его и повторите попытку. Вы будете исправлены. - person raddevus; 22.12.2015
comment
Я только что попытался удалить refreshForm(), и ничего не изменилось, - person Snappawapa; 22.12.2015
comment
@Snappawapa Итак, вам нужно посмотреть, есть ли что-то не так с вашей установкой .NET. Вы можете скачать мое простое приложение формы с: codeproject.com/Tips/1066094 / Соберите это и попробуйте запустить. Если вы не можете запустить это, то у вас проблема с установкой. Кроме того, вы можете попробовать создать совершенно новый проект, собрать его и посмотреть, будет ли он собираться и работать вне студии. - person raddevus; 22.12.2015
comment
проверьте мое обновление, оно работает без отладки, но теперь у него такая же проблема при установке. - person Snappawapa; 23.12.2015
comment
@Snappawapa Это, вероятно, просто потому, что ваше место установки ссылается на старый exe-файл или когда вы пересобирали установку hte, вы построили ее со старой версией exe-файла. Если вы исправили его и он запускается, маловероятно, что установка вызовет ту же проблему. Сделайте Build...Clean..Rebuild...All... затем также пересоберите свой установочный пакет. Тогда, наверное, все будет хорошо. - person raddevus; 23.12.2015

Первое, что я бы сделал, это взял бы этот метод RefreshForm() и поместил бы его в событие OnLoad, завернутое в блок try..catch.

try
{
    RefreshForm();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

Таким образом, если проблема связана с RefreshForm, вы узнаете причину, и приложение, по крайней мере, запустится.

Если вы не видите окно сообщения, значит, это что-то более фундаментальное.

person Rob King    schedule 22.12.2015
comment
Вы также можете засорить свое приложение окнами сообщений, поскольку вы только начинаете работу с приложением, с сообщением о том, на каком этапе оно находится. Это даст вам навигационную цепочку для отслеживания проблемы. - person Rob King; 22.12.2015
comment
Я только что попробовал try/catch при загрузке, ошибки не обнаруживаются и не отображаются, даже при запуске вне отладки. (и я знаю, что форма также обновляется при запуске из отладки). Все работает хорошо, за исключением запуска вне отладки, где он вообще не запускается, по-видимому - person Snappawapa; 22.12.2015
comment
@Snappawapa Да, я этого и ожидал. Вы не можете поймать исключение. Это проблема курицы и яйца: что было раньше? Вы пытаетесь что-то сделать в своем вызове refreshForm() до того, как форма будет полностью построена. У вас возникли трудности с комментированием этой строки? Покажите нам этот код, и я смогу более подробно рассказать вам, почему это происходит. Я видел, как один и тот же тип кода запускался на многих машинах, а затем терпел неудачу на одной машине. Это вопрос времени, но ваш код должен быть изменен. Причина, по которой это работает в VSTudio, заключается в тайминге — он самовосстанавливается. - person raddevus; 22.12.2015
comment
@Snappawapa был try..catch в загрузке формы, а не в конструкторе? Важно, чтобы это было - вы не хотите бизнес-логику и вызовы методов в конструкторе - person Rob King; 22.12.2015
comment
После удаления всего как из onLoad, так и из конструктора, он, наконец, запускается без проблем. Мне кажется, что OnLoad все еще происходит до того, как будет представлена ​​сама форма. - person Snappawapa; 23.12.2015
comment
@Snappawapa, это была моя точка зрения. Вы должны точно знать порядок событий для создания формы, загрузки и т. д. Так что вы можете пойти дальше и отметить мой ответ. :) - person raddevus; 23.12.2015
comment
@RobKing Спасибо, что указали мне правильное направление. проверьте мое обновление, оно работает без отладки, но теперь у него такая же проблема при установке. - person Snappawapa; 23.12.2015
comment
@Snappawapa не стесняйтесь отмечать это как ответ :) - person Rob King; 24.12.2015

Итак, на будущее понятно, что решило проблему:

  1. удалена функция, которая играла с элементами формы из конструктора и при загрузке, перемещена в функцию, связанную с событием onShow
  2. Все почистил и восстановил.
  3. Мне также нужно было добавить «Реализация среды выполнения из« имени проекта здесь »» и «Локализованные ресурсы из« имени проекта здесь »», чтобы он работал. (это не было указано в руководстве, которому я следовал)
person Snappawapa    schedule 22.12.2015