powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Консольное приложение: нужен совет
17 сообщений из 17, страница 1 из 1
Консольное приложение: нужен совет
    #39736646
256k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть работающее WinForms приложение, простое, с одной главной формой и неколькоими батонами, как сделать, чтобы оно по флажку умело работать еще и в режиме консольного приложения: типа без формы, с выводом лога в консоль?
...
Рейтинг: 0 / 0
Консольное приложение: нужен совет
    #39736658
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно, чтобы оно прям натуральную консоль использовала?
Или просто текстбокс на всю форму с черным фоном и белыми буквами?
...
Рейтинг: 0 / 0
Консольное приложение: нужен совет
    #39736669
256k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Это приложение работает так: в форме юзер отмечает нужные параметры: чекбоксы, комбобоксы и т.д и жмет батон "Экзэк"
и оно выполняет набор команд на диске и в базе, рисует прогресс.
Юзер хочет запускать его в тимсити сервере, там надо приложение без гуи, с командной строкой, все параметры можно передать через аргументы и чтобы лог писался. А натянуть дурилку на форму не получится.
Ну, вот.
...
Рейтинг: 0 / 0
Консольное приложение: нужен совет
    #39736679
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
256k,
Тога перегрузить вроде..... По флажку.
...
Рейтинг: 0 / 0
Консольное приложение: нужен совет
    #39736690
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть вариант такой:
Изначально приложение нужно делать консольным. В консольном приложении, если оно запущено без аргументов вызываете WinAPI функцию FreeConcole, что приведет к закрытию окна и освобождению консоли, затем создаете Application.
Недостатком такого применения будет то, что консольное окно будет отображаться при каждом запуска, до момент FreeConsole.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
    class Program
    {
        [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
        static extern bool FreeConsole();

        [STAThread]
        static void Main(string[] args)
        {
            if (args.Length  < 1)
            {
                StartWinFormsApp(args);
            }
            else
            {
                StartConsoleApp(args);
            }
        }

        static void StartWinFormsApp(string[] args)
        {
            FreeConsole();
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

        static void StartConsoleApp(string[] args)
        {
            Console.WriteLine("Hello world");
        }
    }
...
Рейтинг: 0 / 0
Консольное приложение: нужен совет
    #39736694
256k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesЕсть вариант такой:
Изначально приложение нужно делать консольным. В консольном приложении, если оно запущено без аргументов вызываете WinAPI функцию FreeConcole, что приведет к закрытию окна и освобождению консоли, затем создаете Application.
Недостатком такого применения будет то, что консольное окно будет отображаться при каждом запуска, до момент FreeConsole.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
    class Program
    {
        [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
        static extern bool FreeConsole();

        [STAThread]
        static void Main(string[] args)
        {
            if (args.Length  < 1)
            {
                StartWinFormsApp(args);
            }
            else
            {
                StartConsoleApp(args);
            }
        }

        static void StartWinFormsApp(string[] args)
        {
            FreeConsole();
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

        static void StartConsoleApp(string[] args)
        {
            Console.WriteLine("Hello world");
        }
    }




ясно, но, что значит "изначально"? оно уже есть финформс, хотелось бы прикрутить и такую возможность.
А что избавиться от постоянного появления консоли никак?
...
Рейтинг: 0 / 0
Консольное приложение: нужен совет
    #39736776
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
256kясно, но, что значит "изначально"? оно уже есть финформс, хотелось бы прикрутить и такую возможность.
А что избавиться от постоянного появления консоли никак?Если оно уже WinForms, вам не составит большого труда переключить его на "Console Application" в свойствах проекта.
Гуглите методы AllocConsole(void) и AttachConsole и другие методы работы с консолью.
Проблема в том, что Console.WriteLine будет криво работать, если приатачиться к родительскому процессу :(
будут проблемы с перенаправлением ввода вывода, а консоль не будет ожидать завершение процесса, а сразу вернет управление в консоль, при этом вывод в консоль будет продолжаться параллельно с выводом другой программы.
с FreeConsole самый быстрый, простой и рабочий вариант
...
Рейтинг: 0 / 0
Консольное приложение: нужен совет
    #39736805
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю есть еще 1 вариант, вы пишите Native приложение на С++, которое создаст домен, загрузит в него сборку вашего приложения и запустит. Перед этим оно аллоцирует консоль и выполнит все операции, которые требуются для работы pipe маршрутизации, тогда всё будет как вам хочется
...
Рейтинг: 0 / 0
Консольное приложение: нужен совет
    #39736816
256k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesдумаю есть еще 1 вариант, вы пишите Native приложение на С++, которое создаст домен, загрузит в него сборку вашего приложения и запустит. Перед этим оно аллоцирует консоль и выполнит все операции, которые требуются для работы pipe маршрутизации, тогда всё будет как вам хочется

Такое нашел, вроде не мигает консоль, когда не надо

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
static class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            if (args.Length > 0)
            {
                // Command line given, display console 
                AllocConsole();
                ConsoleMain(args);
            }
            else
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }
        private static void ConsoleMain(string[] args)
        {
            Console.WriteLine("Command line = {0}", Environment.CommandLine);
            for (int ix = 0; ix < args.Length; ++ix)
                Console.WriteLine("Argument{0} = {1}", ix + 1, args[ix]);
            Console.ReadLine();
        }

        [System.Runtime.InteropServices.DllImport("kernel32.dll")]
        private static extern bool AllocConsole();
    }
...
Рейтинг: 0 / 0
Консольное приложение: нужен совет
    #39736837
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
256k,

есть ещё такая штука: AttachConsole (ATTACH_PARENT_PROCESS). Если из консоли запукают, то проканает
...
Рейтинг: 0 / 0
Консольное приложение: нужен совет
    #39736852
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)256k,

есть ещё такая штука: AttachConsole (ATTACH_PARENT_PROCESS). Если из консоли запукают, то проканает
запускать можно от куда угодно, но pipe'ы работать не будут и проблему с тем, что WinForms приложение немедленно возвращает управление тоже ни как не решается.
...
Рейтинг: 0 / 0
Консольное приложение: нужен совет
    #39736862
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

ну пайпы это не консоль - речь вроде о консоли шла, и если консоли у родителя нет, то и подцепляться не к чему

ну а в общем конечно принципиально, то что консольное\не консольное это флаг в заголовке исполнимого файла, и надо выбирать
...
Рейтинг: 0 / 0
Консольное приложение: нужен совет
    #39736899
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

есть вариант проще, делайте 2 приложения на одной сборке или просто Console приложение, у которой в Reference стоит ваша неконсольная программа или наоборот и всех делов. Либо вариант с загрузчиком домена, но как по мне, овчинка выделки не стоит.
Тот вариант, что я кинул в начале, самый просто и главное рабочий. А появляющееся окно в начале, не самое страшное, что могло случиться.
...
Рейтинг: 0 / 0
Консольное приложение: нужен совет
    #39745906
256k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes256kясно, но, что значит "изначально"? оно уже есть финформс, хотелось бы прикрутить и такую возможность.
А что избавиться от постоянного появления консоли никак?Если оно уже WinForms, вам не составит большого труда переключить его на "Console Application" в свойствах проекта.
Гуглите методы AllocConsole(void) и AttachConsole и другие методы работы с консолью.
Проблема в том, что Console.WriteLine будет криво работать, если приатачиться к родительскому процессу :(
будут проблемы с перенаправлением ввода вывода, а консоль не будет ожидать завершение процесса, а сразу вернет управление в консоль, при этом вывод в консоль будет продолжаться параллельно с выводом другой программы.
с FreeConsole самый быстрый, простой и рабочий вариант


мне надо, чтобы по флажку юзер мог запустить как гуёвое приложение или как консоль.

Еще вопрос: как прилепить иконку и титул консоли, если использовать вариант типа тех, что выше приведены с использованием
kernel32
AllocConsole();

и т.д.
...
Рейтинг: 0 / 0
Консольное приложение: нужен совет
    #39746060
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
256kЕще вопрос: как прилепить иконку и титул консоли, если использовать вариант типа тех, что выше приведены с использованием
kernel32
AllocConsole();
Console.Title установить
иконку - в свойствах проекта задать
...
Рейтинг: 0 / 0
Консольное приложение: нужен совет
    #39746067
256k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил256kЕще вопрос: как прилепить иконку и титул консоли, если использовать вариант типа тех, что выше приведены с использованием
kernel32
AllocConsole();
Console.Title установить
иконку - в свойствах проекта задать

ясно, сбило с толку то, что, если пускаю из-под студии с vshost, то иконки нет
...
Рейтинг: 0 / 0
Консольное приложение: нужен совет
    #39746217
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejteskealon(Ruslan),

есть вариант проще, делайте 2 приложения на одной сборке или просто Console приложение, у которой в Reference стоит ваша неконсольная программа или наоборот и всех делов. Либо вариант с загрузчиком домена, но как по мне, овчинка выделки не стоит.
Тот вариант, что я кинул в начале, самый просто и главное рабочий. А появляющееся окно в начале, не самое страшное, что могло случиться.
Я бы просто завел conditional variable в проекте, отдельную платформу под консольную конфигурацию, и зависимости от её значения собирал бы проект либо в консольной конфигурации, либо в оконной - как-то так:
в .csproj:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
<Choose>
  <When Condition=" '$(Platform)' == 'ConsoleApp' ">
    <PropertyGroup>
      <OutputType>Exe</OutputType>
    </PropertyGroup>
  </When>
  <Otherwise>
    <PropertyGroup>
      <OutputType>WinExe</OutputType>
    </PropertyGroup>
  </Otherwise>
</Choose>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|ConsoleApp' ">
  <PlatformTarget>x86</PlatformTarget>
  <DebugSymbols>true</DebugSymbols>
  <DebugType>full</DebugType>
  <Optimize>false</Optimize>
  <OutputPath>bin\Debug\</OutputPath>
  <DefineConstants>DEBUG;TRACE</DefineConstants>
  <ErrorReport>prompt</ErrorReport>
  <WarningLevel>4</WarningLevel>
  <DefineConstants>CONSOLE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|ConsoleApp' ">
  <PlatformTarget>x86</PlatformTarget>
  <DebugType>pdbonly</DebugType>
  <Optimize>true</Optimize>
  <OutputPath>bin\Release\</OutputPath>
  <DefineConstants>TRACE</DefineConstants>
  <ErrorReport>prompt</ErrorReport>
  <WarningLevel>4</WarningLevel>
  <DefineConstants>CONSOLE</DefineConstants>
</PropertyGroup>


в Program.cs:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
namespace wf_test
{
  static class Program
  {
#if !CONSOLE
    [STAThread]
    static void Main()
    {
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new Form1());
    }
#endif

#if CONSOLE
    static void Main()
    {
      Console.WriteLine("This is console app");
    }
#endif
  }
}


Потом в конфигурации проекта просто нужно будет выбрать нужную платформу перед компиляцией.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Консольное приложение: нужен совет
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]