2012-03-21 7 views
3

Я разрабатываю в C# два простых приложения, работающих на одном и том же локальном компьютере без сетевых требований.Обмен переменными между запущенными приложениями в C#

Первое приложение инициализирует DLL (Class1) и устанавливает переменную. Второе приложение просто прочитало данные, которые ранее были сохранены. Оба приложения устанавливают один и тот же класс1.

Код:

  • DLL (Class1):

    public class Class1 
    { 
    
    private string variableName; 
    
    public string MyProperty 
    { 
        get { return variableName; } 
        set { variableName = value; } 
        } 
    
    } 
    
  • Применение А:

    class Program 
    { 
    static void Main(string[] args) 
    { 
        Class1 class1 = new Class1(); 
    
        string localReadVariable = Console.ReadLine(); 
    
        class1.MyProperty = localReadVariable; 
    
        } 
    } 
    
  • Применение B:

    class Program 
    { 
        static void Main(string[] args) 
    { 
        ClassLibraryA.Class1 localClass = new ClassLibraryA.Class1(); 
    
        string z = localClass.MyProperty; 
    
        Console.WriteLine(z); 
    } 
    } 
    

Моя проблема в том, что я не знаю, как читать переменную из другого потока.

Применение B должны читать «VARIABLENAME» установленное приложение B

Спасибо

+0

Возможно, это то, что вы ищете http: // stackoverflow.com/questions/1360533/how-to-share-data-between-different-threads-in-c-sharp-using-aop –

+0

Надеюсь, вам известно о том, что каждая программа имеет свой собственный экземпляр класса Class1! –

+0

Да! Проблема в том, что оба приложения создают разные экземпляры, и я не знаю, как их легко передать. Я слышал о WCF, трубах, регистрах ... но я не могу найти реализацию esay, которая, я уверен, есть ... @Wimbo Я тоже нашел это, но, насколько я знаю, этот пост - это связь между потоки из одного экземпляра - это? В моем случае у меня разные темы из разных экземпляров. – kmxillo

ответ

4

Вам нужно какой-то механизм для обмена данными между приложениями.

Это может быть в реестре, файлы, memory mapped files и т.д. ...

Если оба приложения должны делать записи, вам необходимо добавить логику синхронизации в код.

+0

Я бы не хотел использовать файлы, потому что данные, хранящиеся в переменной, являются «паролем» Что относительно реестра? Можете ли вы предоставить пример кода фрагмента для этого механизма? – kmxillo

+0

@kmxillo - Почему вы считаете, что использование реестра безопаснее, чем файлы? Вы всегда можете указать пароль перед записью. – Oded

+0

Я бы предложил использовать WCF для взаимодействия между процессами, так как вам не придется беспокоиться о доступе к файлам и не блокировать их: http://www.switchonthecode.com/tutorials/wcf-tutorial-basic-interprocess-communication – Slugart

0

Вы можете использовать .net Remoting для связи между двумя вашими приложениями.
Удаленный доступ также не требует сетевого адреса для связи.

+2

Remoting устарел уже давно. WCF был механизмом для использования в течение довольно долгого времени. – Oded

+0

Спасибо за обновление - не использовали удаленный доступ с 2.0 и фактически использовали WCF, но теперь не знали его также рекомендуемый способ для IPC ... – ChrFin

+2

.NET Remoting может быть устаревшим, но это не делает этот ответ технически неправильно или что-то в этом роде. Это законный вариант; просто не самый лучший. –

1

В приложении B нет простого способа чтения данных, созданных в приложении A. Каждое приложение имеет собственное адресное пространство и, следовательно, не знает о существовании других.

Но есть способы сделать это!

См this question одного метода ..

+0

Что происходит, когда приложения работают в одном процессе? – kmxillo

+0

@kmxillo: Каждое приложение работает в собственном процессе, они не обмениваются процессами. – Skizz

1

я успешно использовал два метода:

  1. Используйте таблицы базы данных, чтобы содержать ваши общие данные. Если вы обмениваете свои звонки на транзакции, тогда вы также защищаете от проблем с параллелизмом от .

  2. Используйте PersistentDictionary, чтобы сохранить ваши данные, защищенные mutex. У вас должна быть некоторая межпроцессная блокировка, поскольку PersistentDictionary может открываться только одним процессом за раз.