Консольное/оконное приложение по наличию аргумента командной строки - C#
Формулировка задачи:
Вопрос:
Можно ли в main() организовать две ветви: если args.Length == 0, то запускается интерфейс Windows Form, а если есть аргумент (имя файла исходных данных), то запускается консоль с выводом результатов расчета в консоль с возможностью переадресации выдачи в файл стандартным способом (через >)?
Решение задачи: «Консольное/оконное приложение по наличию аргумента командной строки»
textual
Листинг программы
static void Main(string[] args)
{
if (args.Length==0)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
else
{
CreateConsole();
}
}
public static void CreateConsole()
{
AllocConsole();
// перенаправление ввода/вывода в консоль. (visual studio перенаправляет в Output window при отладке проекта с типом Windows приложение)
IntPtr defaultStdout = new IntPtr(7);
IntPtr currentStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if (currentStdout != defaultStdout)
{
SetStdHandle(STD_OUTPUT_HANDLE, defaultStdout);
}
IntPtr defaultStdin = new IntPtr(3);
IntPtr currentStdint = GetStdHandle(STD_INPUT_HANDLE);
if (currentStdint != defaultStdin)
{
SetStdHandle(STD_INPUT_HANDLE, defaultStdin);
}
}
private const int STD_OUTPUT_HANDLE = -11;
private const int STD_INPUT_HANDLE = -10;
[DllImport("kernel32.dll")]
private static extern IntPtr GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll")]
private static extern void SetStdHandle(int nStdHandle, IntPtr handle);
[DllImport("kernel32.dll")]
static extern bool AllocConsole();