Как я создаю приложение C#, которое решает себя, показать ли консолью или оконным приложением?

Это держало меня в тупике довольно долгое время, я бы сделал что-то вроде этого:

Теперь, если вы console.log (дома), вы получите 3 случайных дома из случайных позиций (как указано выше) комментарий) позволение игрокам 2 и 3 получить дома раньше, чем игроки 1 и 2

Надеюсь, это поможет :) Кажется, это забавная игра:

//Houses Array:
var HousesArray = ['Stark', 'Lanister', 'Greyjoy', 'Barathion', 'Arryn', 'Tyrell', 'Martell', 'Targaryen'];

// stores the houses
var houses = [];

// Generates 3 random numbers and allows players 2 and 3 to get the houses early in position than player 1 and 2
var arr = [];
while (arr.length < 3) {
    var r = Math.floor(Math.random() * 8);
    if(arr.indexOf(r) === -1) arr.push(r);
}

// Pushed the houses to the house array
for (var x = 0; x < arr.length; x++) {
  houses.push(HousesArray[arr[x]])
} 

console.log(houses);
46
задан Matthew 30 April 2009 в 17:00
поделиться

9 ответов

Сделайте приложение обычным приложением для Windows и, при необходимости, создайте консоль на лету.

Более подробная информация на по этой ссылке (код ниже)

using System;
using System.Windows.Forms;

namespace WindowsApplication1 {
  static class Program {
    [STAThread]
    static void Main(string[] args) {
      if (args.Length > 0) {
        // Command line given, display console
        if ( !AttachConsole(-1) ) { // Attach to an parent process console
           AllocConsole(); // Alloc a new console
        }

        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();

    [System.Runtime.InteropServices.DllImport("kernel32.dll")]
    private static extern bool AttachConsole(int pid);

  }
}
57
ответ дан 26 November 2019 в 20:23
поделиться

Может быть, эта ссылка даст некоторое представление о том, что вы хотите сделать.

1
ответ дан 7 November 2019 в 14:06
поделиться

Написать два приложения (одну консоль, одно окно), а затем написать другое приложение меньшего размера, которое на основе заданных параметров откроет одно из других приложений (а затем, вероятно, закроет себя, так как оно не будет больше не нужно)?

7
ответ дан 26 November 2019 в 20:23
поделиться

Я сделал это, создав два отдельных приложения.

Создайте приложение WPF с таким именем: MyApp.exe . И создайте консольное приложение с таким именем: MyApp.com . При вводе имени приложения в командной строке, например, MyApp или MyApp / help (без расширения .exe ) консольное приложение с . Расширение com будет иметь приоритет. Вы можете сделать так, чтобы ваше консольное приложение вызывало MyApp.exe в соответствии с параметрами.

Именно так ведет себя devenv. Ввод devenv в командной строке запустит IDE Visual Studio. Если вы передадите такие параметры, как / build , они останутся в командной строке.

5
ответ дан 26 November 2019 в 20:23
поделиться

Один из способов сделать это - написать приложение Window, которое не показывает окно, если аргументы командной строки указывают, что оно не должно.

Вы всегда можете получить аргументы командной строки и проверьте их, прежде чем показывать первое окно.

1
ответ дан 26 November 2019 в 20:23
поделиться

ПРИМЕЧАНИЕ. Я не проверял это, но считаю, что это будет работать ...

Вы можете сделать это:

Сделать ваше приложение приложением Windows Forms. Если вы получили запрос на консоль, не показывайте свою основную форму. Вместо этого используйте платформу invoke для вызова консольных функций в Windows API и выделения консоли на лету.

(Либо используйте API, чтобы скрыть консоль в консольном приложении, но вы ' вероятно, я увидел бы «мерцание» консоли, как оно было создано в этом случае ...)

4
ответ дан 26 November 2019 в 20:23
поделиться

Насколько я знаю, в исполняемом файле есть флаг, указывающий, запускать ли его как консольное или оконное приложение. Вы можете щелкнуть флаг с помощью инструментов, которые поставляются с Visual Studio, но вы не можете сделать это во время выполнения.

Если exe-файл скомпилирован как консоль, то он всегда будет открывать новую консоль, если она не запущена с одной. Если exe-приложение является приложением, оно не может быть выведено на консоль. Вы можете создать отдельную консоль, но она не будет вести себя как консольное приложение.

В прошлом мы использовали 2 отдельных exe-файла. Консоль, являющаяся тонкой оберткой над формой (вы можете ссылаться на exe, как если бы вы ссылались на dll, и вы можете использовать атрибут [assembly: InternalsVisibleTo ("cs_friend_assemblies_2")], чтобы доверять консоли, так что вы не должны нужно выставить больше, чем нужно).

2
ответ дан 26 November 2019 в 20:23
поделиться

Я бы создал решение, которое представляет собой приложение Windows Form, так как есть две функции, которые вы можете вызвать, которые подключатся к текущей консоли. Таким образом, вы можете рассматривать программу как консольную программу. или по умолчанию вы можете запустить графический интерфейс.

Функция AttachConsole не будет создавать новую консоль. Для получения дополнительной информации о AttachConsole, посмотрите PInvoke: AttachConsole

Ниже приведен пример программы, как его использовать.

using System.Runtime.InteropServices;

namespace Test
{
    /// <summary>
    /// This function will attach to the console given a specific ProcessID for that Console, or
    /// the program will attach to the console it was launched if -1 is passed in.
    /// </summary>
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool AttachConsole(int dwProcessId);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool FreeConsole();


    [STAThread]
    public static void Main() 
    {   
        Application.ApplicationExit +=new EventHandler(Application_ApplicationExit);
        string[] commandLineArgs = System.Environment.GetCommandLineArgs();

        if(commandLineArgs[0] == "-cmd")
        {
            //attaches the program to the running console to map the output
            AttachConsole(-1);
        }
        else
        {
            //Open new form and do UI stuff
            Form f = new Form();
            f.ShowDialog();
        }

    }

    /// <summary>
    /// Handles the cleaning up of resources after the application has been closed
    /// </summary>
    /// <param name="sender"></param>
    public static void Application_ApplicationExit(object sender, System.EventArgs e)
    {
        FreeConsole();
    }
}
2
ответ дан 26 November 2019 в 20:23
поделиться

Нет 1. Легко.

Нет 2, я не думаю.

Документы говорят:

Вызовы, такие как Write и WriteLine, не влияют на приложения Windows.

Класс System.Console инициализируется по-разному в приложениях консоли и графического интерфейса. Вы можете убедиться в этом, посмотрев класс Console в отладчике в каждом типе приложения. Не уверен, есть ли способ его инициализации.

Демо: Создайте новое приложение Windows Forms, затем замените метод Main следующим:

    static void Main(string[] args)
    {
        if (args.Length == 0)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
        else
        {
            Console.WriteLine("Console!\r\n");
        }
    }

Идея состоит в том, что любые параметры командной строки будут выводиться на консоль и завершаться. Когда вы запускаете его без аргументов, вы получаете окно. Но когда вы запускаете его с аргументом командной строки, ничего не происходит.

Затем выберите свойства проекта, измените тип проекта на «Консольное приложение» и перекомпилируйте. Теперь, когда вы запускаете его с аргументом, вы получаете «Консоль!» Как ты хочешь. И когда вы запускаете его (из командной строки) без аргументов, вы получаете окно. Но командная строка не вернется, пока вы не выйдете из программы. И если вы запустите программу из Explorer, откроется командное окно, а затем вы получите окно.

0
ответ дан 26 November 2019 в 20:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: