Как пройти аргументы в приложение консоли, если он уже работает?

StackOverflow https://stackoverflow.com/questions/3257311

Вопрос

Я использую приложение консоли в 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.

Что происходит, в том, что при вызове приложении в любое время после того, как во-первых, новый экземпляр процесса запускается вместо аргументов командной строки, идущей на существующее, уже запущенное приложение.

END EDIT

Решение довольно простое и требует двух штук.

  1. Вам нужен namex mutex. Для любой (плохой) причины CF не подвергается версии MUTEX, которая принимает имя, поэтому вы должны p / inzoke CreateMutex или используйте библиотеку (например, SDF), которая уже имеет его. Ваше приложение необходимо создать Mutex при запуске и проверке, чтобы увидеть, если это уже существует. Если это не то, что вы первый пример и пробежьте как обычно. Если Mutex существует, вам необходимо пройти вашу командную строку AGR, которые уже запущены через очередь p2p затем просто выходит.

  2. После проверки mutex первый экземпляр порождает рабочая нить. Эта тема прослушивает в очереди P2P для сообщений. Когда они приходят, вы справляетесь с ними.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top