Команды Windows Forms + из консоли на языке C#
Я прочитал несколько тем о программах, которые объединяют Windows Forms и консольные приложения, но, похоже, мой вопрос еще не решен. Можно ли запустить программу из cmd-line и управлять приложением с помощью форм и команд cmd-line? Это значит:
- для обычных пользователей приложения для управления приложением через (Windows Forms) формы,
- для отладки и продвинутых пользователей для управления приложением через консоль (и дополнительно посмотреть, что происходит в Windows Forms))
Я знаю, что то, что я хочу, это довольно большое дело, и это, вероятно, будет означать много работы, но все же я хотел бы знать, как это сделать правильно.
6 ответов
это не сложно, просто P / вызовите функцию API AllocConsole (), чтобы создать свою собственную консоль. Например, сделайте свою программу.файл исходного кода cs выглядит так:
static class Program {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
#if DEBUG
CreateConsole();
#endif
Application.Run(new Form1());
}
static void CreateConsole() {
var t = new System.Threading.Thread(() => {
AllocConsole();
for (; ; ) {
var cmd = Console.ReadLine();
if (cmd.ToLower() == "quit") break;
// Etc...
}
FreeConsole();
});
t.IsBackground = true;
t.Start();
}
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern bool AllocConsole();
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern bool FreeConsole();
}
вам просто нужно запустить приложение Windows Forms с ApplicationContext вместо самой формы. Затем вы не зависите от основной формы, которая будет показана, и можете действовать как консольное приложение.
вы также можете просто создать исполняемый файл командной строки и связать себя с библиотеками Windows Forms, чтобы использовать их.
другой способ-использовать какой-то стартер, который запускает приложение Windows Forms и командную строку средство, которое взаимодействует с приложением Windows Forms через локальную сеть или другие межпроцессные связи, D-Bus или подобные системы - многие пути ведут в Рим...
да, то, что вы хотите, очень возможно. У тебя есть выбор. О некоторых я могу думать...:
используйте UI Automation для записи приложения контроллера, которое может подключаться к приложению Windows Forms и управлять им. Это новое в Windows Vista. Есть управляемые классы, упакованные в
System.Windows.Automation
пространство имен, которое впервые поставляется в WPF, который прибыл в .NET 3.0. (Теперь, когда я думаю об этом, я не уверен, что "новое в Windows Vista" верно. Это может быть " new in .NET 3.0", что подразумевает, что он также работает на Windows XP. Хммм....) Автоматизация пользовательского интерфейса не требует изменения кода в приложении Windows Forms, но она может быть низкоуровневой, потому что вам нужно запрограммировать каждый щелчок мыши или вырезать/вставить. См.ответ на вопрос переполнения стека есть ли способ управлять сторонним EXE-файлом из VB.NET?.-
измените приложение Windows Forms, чтобы открыть его функцию через об ошибке wm_copydata взаимодействие. Затем клиентское приложение может взаимодействовать с ним. Опять же, модель здесь-это два разных приложения, одно из которых может контролировать или опрашивать другое. The .NET рефлектор инструмент является хорошим примером такого подхода. Существует ReflectorController, доступный как часть проект ReflectorAddins на CodePlex. Контроллер-это инструмент командной строки, который может отправлять
WM_COPYDATA
сообщения рефлектору, чтобы сказать ему, чтобы открыть новую сборку, перейдите к особый класс и так далее.код для контроллера: http://reflectoraddins.codeplex.com/sourcecontrol/network/Show?projectName=reflectoraddins&changeSetId=29526#19979
этот подход будет работать для любого приложения Windows Forms. Вам нужно будет переопределить метод WndProc. Чтобы увидеть, как, проверьте Проект Код статьи используйте WM_COPYDATA для отправки данных в / из окон C++ и C# процессы.
Я также использовал этот подход для создания монитора прогресса на основе Windows Forms, который может визуально отображать ход длительных тестов.
в приложении откройте объект COM-сервера, который можно запрограммировать. Именно так Microsoft предоставляет функции Office приложениям. Автоматизация офиса позволяет любой COM-способной программе (C#,VBScript, PowerShell, Perl, PHP и т. д.) к "привод" офисных приложений. Приложение Office отображается во время этого процесса. Этот подход также потребует дополнительного кода в приложении Windows Forms; в частности, вы должны разместить COM-объект и подключить его к уровню пользовательского интерфейса. Это может быть предпочтительнее, если вы хотите максимальную гибкость для суперпользователей - они могут писать свои собственные сценарии для управления этим компонентом.
Я уверен, есть и другие варианты.
Я помню установить IronPython используется в демо-версии управления Windows Forms из интерфейса командной строки Python (ожидания).
Edit: Я не смог найти оригинальное видео, но это должно показать, что возможно без особых усилий. посмотреть видео и перейти к 19: 00.
Это было бы возможно. Вам придется заглянуть в потоковую форму Windows Forms, возможно, с использованием отдельного домен приложения в рамках того же процесса. Вы можете изучить создание прокси-объекта (своего рода класса сообщений, наследующего MarshalByRefObject).
обычно при просмотре вашего приложения у вас есть слой пользовательского интерфейса и бизнес-слой (и слой данных, и кто знает еще много слоев). Клиент консоли можно рассматривать как слой пользовательского интерфейса (с простыми входными данными команд), а клиент Windows Forms-как другой.
просто проверить при запуске приложения для аргументов командной строки. Если заданы аргументы, создайте экземпляр простых классов консоли, в противном случае создайте экземпляр (возможно, более сложных) Windows Forms занятия.
Если вы хотите, чтобы ваши изменения отражались в приложении Windows Forms (контролируя его из консольного приложения), настройте свои приложения как можно больше с привязкой данных. Пусть ваш бизнес-уровень отражает то, что на самом деле происходит в вашем приложении.