Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Консольное приложение: нужен совет / 17 сообщений из 17, страница 1 из 1
22.11.2018, 11:42
    #39736646
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консольное приложение: нужен совет
Есть работающее WinForms приложение, простое, с одной главной формой и неколькоими батонами, как сделать, чтобы оно по флажку умело работать еще и в режиме консольного приложения: типа без формы, с выводом лога в консоль?
...
Рейтинг: 0 / 0
22.11.2018, 11:52
    #39736658
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консольное приложение: нужен совет
Нужно, чтобы оно прям натуральную консоль использовала?
Или просто текстбокс на всю форму с черным фоном и белыми буквами?
...
Рейтинг: 0 / 0
22.11.2018, 12:06
    #39736669
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консольное приложение: нужен совет
Shocker.Pro,
Это приложение работает так: в форме юзер отмечает нужные параметры: чекбоксы, комбобоксы и т.д и жмет батон "Экзэк"
и оно выполняет набор команд на диске и в базе, рисует прогресс.
Юзер хочет запускать его в тимсити сервере, там надо приложение без гуи, с командной строкой, все параметры можно передать через аргументы и чтобы лог писался. А натянуть дурилку на форму не получится.
Ну, вот.
...
Рейтинг: 0 / 0
22.11.2018, 12:11
    #39736679
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консольное приложение: нужен совет
256k,
Тога перегрузить вроде..... По флажку.
...
Рейтинг: 0 / 0
22.11.2018, 12:20
    #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
22.11.2018, 12:24
    #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
22.11.2018, 13:26
    #39736776
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консольное приложение: нужен совет
256kясно, но, что значит "изначально"? оно уже есть финформс, хотелось бы прикрутить и такую возможность.
А что избавиться от постоянного появления консоли никак?Если оно уже WinForms, вам не составит большого труда переключить его на "Console Application" в свойствах проекта.
Гуглите методы AllocConsole(void) и AttachConsole и другие методы работы с консолью.
Проблема в том, что Console.WriteLine будет криво работать, если приатачиться к родительскому процессу :(
будут проблемы с перенаправлением ввода вывода, а консоль не будет ожидать завершение процесса, а сразу вернет управление в консоль, при этом вывод в консоль будет продолжаться параллельно с выводом другой программы.
с FreeConsole самый быстрый, простой и рабочий вариант
...
Рейтинг: 0 / 0
22.11.2018, 13:58
    #39736805
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консольное приложение: нужен совет
думаю есть еще 1 вариант, вы пишите Native приложение на С++, которое создаст домен, загрузит в него сборку вашего приложения и запустит. Перед этим оно аллоцирует консоль и выполнит все операции, которые требуются для работы pipe маршрутизации, тогда всё будет как вам хочется
...
Рейтинг: 0 / 0
22.11.2018, 14:17
    #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
22.11.2018, 14:40
    #39736837
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консольное приложение: нужен совет
256k,

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

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

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

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

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


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

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

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

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


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