Как запустить консольное приложение .NET в фоновом режиме - PullRequest
51 голосов
/ 22 апреля 2010

У меня есть консольное приложение, написанное на C #, которое планируется запускать каждые 15 минут или около того с помощью встроенного планировщика задач Windows.

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

Ответы [ 9 ]

157 голосов
/ 22 апреля 2010

Проект> Свойства> вкладка Приложения> изменить тип вывода на «Приложение Windows».

Нет больше окна консоли.

50 голосов
/ 22 апреля 2010

Легко!

В это трудно поверить, но это работает как шарм. Я использовал это для некоторых проектов установки, когда вы хотите выполнять пользовательские задачи без каких-либо признаков.

  • Создайте проект как проект приложения Windows (это сложная часть).
  • Никогда не звоните ни в какую форму. Просто продолжайте в том же духе, как в вашем консольном приложении

    class Program
    {
        static void Main(string[] args)
        {
            // Just don't call Application.Run(new frmMain(args));
    
            // ... your code
        }
     }
    

Это связано с тем, что проекты приложений Windows в действительности не отличаются от консольных, за исключением случаев, когда используются первая форма и ссылки. Это полностью скрытое исполнение. Попробуй!

9 голосов
/ 22 апреля 2010

Вы можете использовать Windows API, чтобы свернуть окно консоли. В противном случае вы можете сделать это EXE-файлом Windows, который на самом деле не загружает форму, и вызвать System.Windows.Forms.Application.Run().

Код для минимизации консоли:

[DllImport( "user32.dll" )]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

public const int SW_SHOWMINIMIZED = 2;

IntPtr winHandle = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle;
ShowWindow(winHandle, SW_SHOWMINIMIZED);
9 голосов
/ 22 апреля 2010

А как насчет реализации приложения в службе Windows? Вы можете установить интервал в 15 минут и запустить операцию в timer_tick.

5 голосов
/ 10 июня 2013

Если у вас уже создано приложение консоли Windows, вы можете просто изменить тип вывода приложения на приложение Windows.

Под ваш проект: Перейдите в Свойства> Приложение Выберите «Приложение Windows» в качестве типа вывода.

Это будет наименьшим эффектом, и вы сможете сохранить в планировщике задач Windows ту же задачу.

3 голосов
/ 22 апреля 2010

Если он ничего не записывает в консоль, вы можете сделать это сервисом. http://msdn.microsoft.com/en-us/library/9k985bc9%28VS.80%29.aspx

2 голосов
/ 22 апреля 2010

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

2 голосов
/ 22 апреля 2010

Грязно, как и все, но ( отсюда ):

Процесс занимает 3 файла. launch.bat, invis.vbs и (ваш программа). В файле launch.bat (этот файл запускается ваша программа молча), вставьте в wscript.exe "C:\yourpath\invis.vbs" "your file.bat". В invis.vbs, положить в

CreateObject("Wscript.Shell").Run """" & WScript.Arguments(0) & """", 0, False

И, наконец, в вашем файле, launch.bat, поместите все, что вы хочу ...

echo off erase c:\junk.txt. Ну ты сделанный. Просто открой launch.bat.

Хотя это работает как шарм. Он запускает первый bat (launch.bat), который, в свою очередь, запускает ваш сервис / исполняемый файл в стелсе. Итак, это быстрый всплеск для первоначального запуска, а затем исчез.

0 голосов
/ 22 апреля 2010

Это легко. Задайте задачу для запуска под учетной записью, которая не является вашей учетной записью.

...