Как пройти аргументы в приложение консоли, если он уже работает?
-
16-09-2020 - |
Вопрос
Я использую приложение консоли в Windows Mobile для обработки входящего перехвата сообщений.В одном консольном приложении я принимаю параметры (string args []), которые на основе параметров, регистрируйте перехватчик сообщений.
Interceptypeype - это enum
static void Main(string[] args)
{
if (args[0] == "Location")
{
addInterception(InterceptorType.Location, args[1],args[2]);
}
}
private static void addInterception(InterceptorType type, string Location, string Number )
{
if (type == InterceptorType.Location)
{
using (MessageInterceptor interceptor = new MessageInterceptor(InterceptionAction.NotifyAndDelete, false))
{
interceptor.MessageCondition = new MessageCondition(MessageProperty.Sender, MessagePropertyComparisonType.Contains, Number, false);
string myAppPath = Assembly.GetExecutingAssembly().GetName().CodeBase;
interceptor.EnableApplicationLauncher("Location", myAppPath);
interceptor.MessageReceived += new MessageInterceptorEventHandler(interceptor_MessageReceived);
}
}
}
static void interceptor_MessageReceived(object sender, MessageInterceptorEventArgs e)
{
//Do something
}
.
Я сделал это консольное приложение, потому что я хочу, чтобы он продолжал работать в фоновом режиме и перехватить входящие сообщения.
Это работает нормально в первый раз.Но проблема в том, что я должен продолжать вызывать метод Addinterception для добавления последующих правил перехвата.Это делает приложение консоли начать снова и снова за каждый раз, когда добавляю правило.Как я могу сделать это только один раз и добавить больше правил перехватчика сообщений?
Решение
Поскольку у вас уже есть метод, чтобы позвонить в командную строку один раз, обновите логику с помощью нескольких простых петлей, чтобы вы могли пройти команды n.
Редактировать: Я написал это полностью компилируемый пример, чтобы показать вам именно то, о чем я говорю.Обратите внимание, как дочерний процесс можно назвать любое количество раз без повторного запуска.Это не только простой запуск командной строки с пропущенными аргументами, потому что эта идея приведет к X процессам, которые именно то, что вы не хотите.
родительский процесс: (тот, с помощью system.diagnostics.process)
/// <summary>
/// This is the calling application. The one where u currently have System.Diagnostics.Process
/// </summary>
class Program
{
static void Main(string[] args)
{
System.Diagnostics.Process p = new Process();
p.StartInfo.CreateNoWindow = false;
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = @"C:\AppfolderThing\ConsoleApplication1.exe";
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.Start();
p.OutputDataReceived += delegate(object sender, DataReceivedEventArgs e)
{
Console.WriteLine("Output received from application: {0}", e.Data);
};
p.ErrorDataReceived += delegate(object sender, DataReceivedEventArgs e)
{
Console.WriteLine("Output received from application: {0}", e.Data);
};
p.BeginErrorReadLine();
p.BeginOutputReadLine();
StreamWriter inputStream = p.StandardInput;
inputStream.WriteLine(1);
inputStream.WriteLine(2);
inputStream.WriteLine(-1);//tell it to exit
p.WaitForExit();
}
}
.
Детский процесс:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication3
{
enum InterceptorType
{
foo,
bar,
zee,
brah
}
/// <summary>
/// This is the child process called by System.Diagnostics.Process
/// </summary>
class Program
{
public static void Main()
{
while (true)
{
int command = int.Parse(Console.ReadLine());
if (command == -1)
Environment.Exit(0);
else
addInterception((InterceptorType)command, "some location", "0");
}
}
private static void addInterception(InterceptorType type, string Location, string Number)
{
switch (type)
{
case InterceptorType.foo: Console.WriteLine("bind foo"); break;
case InterceptorType.bar: Console.WriteLine("bind bar"); break;
default: Console.WriteLine("default bind zee"); break;
}
}
static void interceptor_MessageReceived(object sender, EventArgs e)
{
//Do something
}
}
}
.
Обратите внимание, что CodePlex имеет a
Другие советы
Редактировать
Кажется, что люди неправильно связаны с вашим вопросом (или я), поэтому вот некоторые разъяснения о том, как я вижу проблему.
У вас есть приложение консоли, которое принимает в параметрах командной строки. Эти параметры используются для чего-то (то, что не имеет значения на самом деле). Вы хотите добавить параметры после того, как приложение уже запущено, вызывая приложение с помощью новой командной строки AGS.
Что происходит, в том, что при вызове приложении в любое время после того, как во-первых, новый экземпляр процесса запускается вместо аргументов командной строки, идущей на существующее, уже запущенное приложение.
Решение довольно простое и требует двух штук.
-
Вам нужен namex mutex. Для любой (плохой) причины CF не подвергается версии MUTEX, которая принимает имя, поэтому вы должны p / inzoke CreateMutex или используйте библиотеку (например, SDF), которая уже имеет его. Ваше приложение необходимо создать Mutex при запуске и проверке, чтобы увидеть, если это уже существует. Если это не то, что вы первый пример и пробежьте как обычно. Если Mutex существует, вам необходимо пройти вашу командную строку AGR, которые уже запущены через очередь p2p затем просто выходит.
-
После проверки mutex первый экземпляр порождает рабочая нить. Эта тема прослушивает в очереди P2P для сообщений. Когда они приходят, вы справляетесь с ними.