Как я могу отправить данные между двумя программами в C #? - PullRequest
2 голосов
/ 22 февраля 2010

У меня есть два приложения -> App1 и App2. App1 открывает App2, передавая некоторые аргументы командной строки, используя System.Diagnostic.Process (). Теперь пользователь обращается к App2.

Однако, когда пользователь изменяет некоторые аргументы команды в App1, мне нужно открыть существующее приложение (App2), не закрывая его с использованием новых параметров.

Как я могу это сделать?

Любая обратная связь будет полезна.

Ответы [ 5 ]

5 голосов
/ 22 февраля 2010

Другим вариантом может быть решение на основе WCF. См. Пример чата WCF

4 голосов
/ 22 февраля 2010

Вы должны использовать IPC. См. Механизмы IPC в C # - Использование и лучшие практики для некоторых полезных ссылок.

1 голос
/ 22 февраля 2010

Почему бы не использовать старый старый TCP / IP с использованием сокетов (клиент и сервер).

0 голосов
/ 22 февраля 2010

Я бы пошел с WindowsFormsApplicationBase классом (из Microsoft.VisualBasic сборки) со следующим кодом в моем Program.cs файле:

using System;
using System.Windows.Forms;
using Microsoft.VisualBasic.ApplicationServices;

namespace TestSolution
{
    sealed class Program : WindowsFormsApplicationBase
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] commandLine)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            var program = new Program()
            {
                IsSingleInstance = Properties.Settings.Default.IsSingleInstance
            };

            // Here you can perform whatever you want to perform in the second instance

            // After Program.Run the control will be passed to the first instance    
            program.Run(commandLine);
        }

        protected override void OnCreateMainForm()
        {
            MainForm = new ImportForm();
        }

        protected override bool OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
        {
            // This code will run in the first instance

            return base.OnStartupNextInstance(eventArgs);
        }
    }
}
0 голосов
/ 22 февраля 2010

То, что вы хотите сделать, не так просто. Предварительно упакованный способ сделать это в .net называется Remoting , он встроен в инфраструктуру и позволяет выполнять IPC (межпроцессные вызовы).

В зависимости от вашего уровня опыта, вы можете лучше использовать свою упрощенную версию. например Пусть две программы передают данные с использованием файлов.

Приложение 1 записывает параметры в текстовый файл (XML, с разделителями, ваш выбор действительно).

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

UPDATE
Как правильно отметил Джон Сондерс, Remoting был заменен WCF , однако по-прежнему имеется много информации об Remoting, и это может быть неплохим началом.

...