2010-02-22 1 views
2

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

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

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

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

+5

Я не пытаюсь быть умным или грубым, но пунктуация - ваш друг. В последнем заявлении я использовал апосторию, запятую и полную остановку, чтобы разъяснить, что я говорю. Люди больше готовы помочь, когда им не нужно тратить время на разработку того, что вы просите. –

+2

Да, пунктуация - это твой друг, и не быть грубым, но не все говорят по-английски как свой первый язык. –

+0

Вам следует попробовать обновить заголовок вопроса, сказать что-то вроде «Как отправить параметры между двумя программами на C#?» Было бы намного больше помочь людям увидеть ваш вопрос, чтобы узнать, о чем он. – Danny

ответ

4

Вы должны использовать IPC. См. IPC Mechanisms in C# - Usage and Best Practices для некоторых полезных ссылок.

+0

Технически вы повторяете исходный вопрос, потому что IPC * - это связь между двумя разными процессами. По вашей ссылке ясно, что вы имеете в виду IPC с WCF, что является хорошим решением этой проблемы. –

0

Что вы хотите сделать, это не прямолинейно. Предварительно упакованный способ сделать это в .net называется Remoting, он встроен в структуру и позволяет IPC (Interprocess calls).

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

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

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

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

+0

Фактически, удаленный доступ устарел в пользу WCF. –

+0

@John: Да, я, кажется, помню, что объявлено. Почему меня не приглашают на эти собрания, на которых эти решения принимаются? Возможно, это будет надзором какого-то переутомленного Microsoft-миньона, или когда-нибудь скоро все эти старые, устаревшие приглашения найдут меня и придут в мой почтовый ящик. , , В любой день . , , –

+0

Я считаю, что WCF имеет несколько более крутую кривую обучения, но желаемый протокол выглядит довольно простым, и там должен быть хороший пример кода для такого же простого общения. –

5

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

+0

+1, потому что в текущей версии .Net WCF является выбором при выполнении IPC. –

0

Я бы с 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); 
     } 
    } 
} 
1

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