Приложения C#.Запуск без формы

можно ли вызвать приложение.Выполнить, но не передать параметр формы, или есть альтернатива, если нет формы для вызова?

метод Run, похоже, не имеет никаких перегрузок, которые не принимают форму.

например, если я хотел сначала создать экземпляр класса, а затем вызвать форму, есть ли способ сделать эквивалент:

Application.Run(myClass);

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

это относится к компактной структуре изначально. Я предполагаю, что именно поэтому метод Run не имеет перегрузки, которую я искал.

4 ответов


Я не понимаю, хотите ли вы сделать:

  1. вы хотите загрузить свою форму где-то еще, кроме Main()
  2. или запустите консоль или приложение-службу с помощью нет пользовательский интерфейс.

на (1):

static void main()
{
    //Your program starts running here<<<

    //Do some stuff...
    FormRunner a = new FormRunner();
    a.RunForm();

} // << And ends here

class FormRunner {

    public void RunForm() {
        Application.Run(new Form());
    }

    //You could call which ever form you want from here?
} // << And ends here

что вам нужно знать, так это то, что ваша программа начинается с первой строки main и заканчивается в конце. , когда вы называете Application.Run(FORM) он загружает цикл сообщений windows для этой формы. Его специальный цикл, который держит программу все еще в основном и ждет событий (они называются сообщениями Windows в win32 API)

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

(2) Итак, теперь, если вы просто хотите чистое консольное приложение без форм:

static void main()
{
    AcceptInputs()
    DrawScreen()

    //Do something else.
    //Make sure your flow stays within the main

} // << Once you come here you're done.

void AcceptInputs()
{
    while(true) {

        //Keep accepting input
        break; // Call break when you're done. You'll be back in the main
    }
}

Я надеюсь, что помог.


метод Run, похоже, не имеет никаких перегрузок, которые не принимают форму.

эээ... http://msdn.microsoft.com/en-us/library/ms157900.aspx

приложение.Методом

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

public static void Run()


Вы можете использовать перегрузку Application.Run, который принимает контекст приложения в качестве единственного параметра. Ан ApplicationContext в основном это просто класс, который вы можете наследовать и добавлять любые функции, которые вам нравятся. См. пример в ссылке для получения дополнительной информации.


using System;
using System.Windows.Forms;

static class Program
   [STAThread]
   static void Main() {
      Application.Run(new myClass());
   }

   internal class myClass : ApplicationContext {
      public myClass() {
         Application.Run(new myWindow());
      }
   }
}

проблема здесь, однако, в том, что что-то должно будет вызвать этот экземпляр myClass и сказать ему выйти, иначе программа будет просто продолжать работать даже после закрытия всех форм. И вызов ExitThread () в конструкторе игнорируется.