Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Обмен данными между приложениями.


Автор: NightmareZ 10.10.2009, 16:40
Как можно передать строку из одного приложения в другое?

Автор: Ram1reS 10.10.2009, 17:28
Файлом, БД, .net remoting, wcf, web-service, msmq, тупо сокеты, etc. ...

Автор: Medved 10.10.2009, 17:42
Да как угодно. Начиная от простейшего метода, через общий файл (текстовой или какой либо другой) и заканчивая специализированными технологиями для интеграции приложений. 
Можешь БД использовать, можешь веб-сервис, можешь локальный сервис на компьютере, или COM взаимодействие. 

Все зависит от контекста и конкретной задачи.

Код

Direct TCP Networking
    System.Net
Message Queuing
    System.Messaging
Распределенные вычисления
    System.Runtime.Remoting
XML веб-сервисы
    System.Web.Services


Вот хорошая презентация на эту тему: https://msdb.ru/Downloads/Docs/Events/Materials/281102/NET02.ppt

Автор: NightmareZ 10.10.2009, 19:47
Зачем нужно: Запускается одна копия приложения. Затем вторая. Вторая обнаруживает, что одна копия уже запущена, завершает свою работу и передаёт первой копии параметры командной строки, если они есть.

Цитата(Ram1reS @  10.10.2009,  17:28 Найти цитируемый пост)
Файлом, БД, .net remoting, wcf, web-service, msmq, тупо сокеты, etc. ...


Файл не в тему, ибо не вижу смысла что-то на диске создавать для такой мелочи. БД тем более.
Сокеты, remoting, wcf... не может какой-нить файрвол это дело блочить?
Msmq под дотНетом есть?

Добавлено через 12 минут и 58 секунд
Сборку System.Messaging.dll не могу подключить. Добавляю референс, а студия пишет, что сборки нету....

user posted image

Автор: Medved 10.10.2009, 20:31
Цитата

Технология Message Queuing позволяет работающим в различное время приложениям взаимодействовать в гетерогенных сетях и системах, которые могут временно отключаться от сети. Приложения отправляют, получают и считывают (то есть читают без удаления) сообщения из очередей. Message Queuing — необязательный компонент операционных систем Windows 2000 и Windows NT, поэтому его следует устанавливать отдельно.

Класс MessageQueue — это упаковщик службы Message Queuing. Существует несколько версий Message Queuing, поэтому при использовании класса MessageQueue его поведение в каждом случае будет несколько другим, в зависимости от используемой операционной системы
.

http://msdn.microsoft.com/ru-ru/library/system.messaging.messagequeue.aspx#Mtps_DropDownFilterText

Автор: NightmareZ 10.10.2009, 23:17
А проще варинт есть?

З.Ы. Сокеты в этом деле плохи тем, что, например, какое-либо другое приложение может использовать тот же порт.

Автор: Crypton 11.10.2009, 01:31
Может лучше Mutex?

Автор: NightmareZ 11.10.2009, 01:33
Цитата(Crypton @  11.10.2009,  01:31 Найти цитируемый пост)
Может лучше Mutex?


А что с ним?

Автор: Medved 11.10.2009, 02:16
Цитата(NightmareZ @  11.10.2009,  04:33 Найти цитируемый пост)
А что с ним? 

С помощью http://ru.wikipedia.org/wiki/%D0%9C%D1%8C%D1%8E%D1%82%D0%B5%D0%BA%D1%81 можно запретить повторный запуск приложения. http://sql.ru/forum/actualthread.aspx?bid=34&tid=396806&hl=%e7%e0%ef%f0%e5%f2%e8%f2%fc+%e7%e0%ef%f3%f1%ea в интернете много решающих эти задачи.

Но это не решает вопроса о передачи строки из одного приложения, в другое.
Используй реестр или временный файл. Это конечно не кошерно, но практично.  

А вообще для меня такого рода прблемы служат индикаторм того, что программист начинает гордить куйню.  Горе от ума вообщем.

Автор: NightmareZ 11.10.2009, 02:50
Цитата(Medved @  11.10.2009,  02:16 Найти цитируемый пост)
С помощью мьютексов можно запретить повторный запуск приложения.

А.... м....... ну я вроде не спрашивал, как запретить повторный запуск.......

Цитата(Medved @  11.10.2009,  02:16 Найти цитируемый пост)
Используй реестр или временный файл. Это конечно не кошерно, но практично.  

Если два приложения одновременно будут писать в файл/реестр?
Как передать первому экземпляру приложения информацию о том, что нужно прочитать этот файл/ветку реестра, ибо информация в нём/ней обновилась?

Цитата(Medved @  11.10.2009,  02:16 Найти цитируемый пост)
А вообще для меня такого рода прблемы служат индикаторм того, что программист начинает гордить куйню.  Горе от ума вообщем.

Ну так просвяти, как избавиться от этой проблемы? Как бы поступил ты?

Автор: Medved 11.10.2009, 04:40
Цитата(NightmareZ @  11.10.2009,  05:50 Найти цитируемый пост)
Ну так просвяти, как избавиться от этой проблемы? Как бы поступил ты?

Зачем тебе запрещать запуск двух копий приложения, и если уж запрещать (что не сложно реализовать черезь мьютексы, которые как раз для таких ситуаций и придуманы), то обязательно передавать параметры командной строки от одного приложения - к другому? Вот это мне сложно понять.
Откуда вообще взялось такое требование, и чем оно продиктовано?
Какие обстоятельства привели тебя к тому, что ты стал решать эту проблему (передавать командную строку)?

Автор: Medved 11.10.2009, 05:03
Просто понимаешь, программирование существует уже относительно давно, и многие задачи уже решали до тебя другие уже 1000 раз. 
Если ты изобретаешь новый язык программирования, то оно понятно, там еще нужно поломать голову, как сделать что-то, что до тебя еще никто не делал. 
Но все остальные вопросы уже давно обдуманы умными бородатыми дядьками, и готовые варианты реализованы в виде конкретных решений, называемых средой разработки (на уровне языков, платформ, паттернов и т.д.).

Вопросы как сделать то, или другое обычно исходят от неумения или лени читать документацию, которая поставляется с платформой, на которой реализуется решение. И особенно это относятся к тем случаям,  которые касаются инфраструктурного кода (в отличии от прикладного уровня,  непосредственно реализующего бизнес-процессы и задачи конечного пользователя) 
Зачастую, задачи, которые реаются простым и изящным способом, неопытные программисты начинают решать "через америку". В смысле, что тебе надо добраться до соседнего дома в Рязани, но ты для этого фрахтуешь частный самолет, летишь через Германию, там пересаживаешься на Боинг, перелетаешь через Атлантику в Нью-Йорк, а от туда на параходе в порт Находка, потом на собачьих упряжках до Новосиба, а от туда уже на поезде до Рязани, потом на такси до нужного дома.  Хотя всего-то надо было пройти 10 метров пешком. 
И это довольно распространенная ситуация в отечественном программировании. Отчасти это объясняется особенностями преподавания и обучения программированию на территории бывшего СНГ, когда вместо того, что обучать программированию, учат кодингу. И книги соответственно по кодированию вместо того чтобы называть их "руководство по кодингу", называют "руководство по программированию".
А кодинг и программирование - это разные понятия. Так как программирование включает в себя линейку - проектирование-кодирование-тестирование. 

Мне вот опыт подсказывает что в данном случае возможна именна такая ситуация.

Автор: Rohoss 11.10.2009, 11:53
Я бы использовал  http://msdn.microsoft.com/ru-ru/library/system.runtime.remoting.channels.ipc.aspx

Добавлено через 6 минут и 6 секунд
Цитата(NightmareZ @  10.10.2009,  19:47 Найти цитируемый пост)
Запускается одна копия приложения. Затем вторая. Вторая обнаруживает, что одна копия уже запущена, завершает свою работу и передаёт первой копии параметры командной строки, если они есть.


Medved, ИМХО, требования вполне адекватные… Мне кажется, подобным образом работают, например видеопроигрыватели, например тот же LightAlloy 



Автор: Medved 11.10.2009, 14:05
Цитата(Rohoss @  11.10.2009,  14:53 Найти цитируемый пост)
Medved, ИМХО, требования вполне адекватные… Мне кажется, подобным образом работают, например видеопроигрыватели, например тот же LightAlloy 

С таким же успехом можно убить певрое (ненужное приложение) и запустить вторую копию, в которую и передаются все данные. 

Цитата(Rohoss @  11.10.2009,  14:53 Найти цитируемый пост)
 System.Runtime.Remoting.Channels.Ipc

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

Автор: NightmareZ 11.10.2009, 14:11
Цитата(Medved @  11.10.2009,  05:03 Найти цитируемый пост)
Мне вот опыт подсказывает что в данном случае возможна именна такая ситуация.

Обгадили с ног до головы. Косолапый считает, что я "неопытный программист", "неумеющий и ленящийся читать документацию", "начитавшийся книг по кодингу". Вот чесно, в реальной жизни я бы предпочёл за такой подход дать по морде, но так как на форумах это не принято и физически нереализуемо, то попрошу лишь не разводить свою философию в моих темах.

Цитата(Rohoss @  11.10.2009,  11:53 Найти цитируемый пост)
Я бы использовал  System.Runtime.Remoting.Channels.Ipc

Ок, спасибо, попробую.

Цитата(Rohoss @  11.10.2009,  11:53 Найти цитируемый пост)
Medved, ИМХО, требования вполне адекватные… Мне кажется, подобным образом работают, например видеопроигрыватели, например тот же LightAlloy 

А ещё так работают, например, Paint.NET, Photoshop....

Цитата(Medved @  11.10.2009,  14:05 Найти цитируемый пост)
С таким же успехом можно убить певрое (ненужное приложение) и запустить вторую копию, в которую и передаются все данные. 

Пойди погуляй. Меня не интересует твои измышлизмы по сабжу. Я задал конкретный вопрос и хочу лишь ответа на него.

Автор: Medved 11.10.2009, 14:21
NightmareZ, прости, не заметил у тебя надписи [хакер], теперь все понятно. 

Цитата(NightmareZ @  11.10.2009,  17:11 Найти цитируемый пост)
"неопытный программист", "неумеющий и ленящийся читать документацию", "начитавшийся книг по кодингу"

Твоя реакция говорит мне о том, что так и есть. Еще сомневался, теперь уж точно уверен. 

А как тебя еще называть? Я тебе помог, а ты вместо благодарности еще и минус залепил. 

Цитата(NightmareZ @  11.10.2009,  17:11 Найти цитируемый пост)
. Вот чесно, в реальной жизни я бы предпочёл за такой подход дать по морде,

Писюн еще не вырос. 

Цитата(NightmareZ @  10.10.2009,  22:47 Найти цитируемый пост)
Сборку System.Messaging.dll не могу подключить. Добавляю референс, а студия пишет, что сборки нету....

Что же ты до конца эту проблему не решил? Столкнулся со сложностью, и тут же решил сдаться? Что до конца не добил? Опытный программист предпочитает разбираться до конца, а не бежать в кусты, при первой возникшей перед ним сложности. 

Ммм..да. Вот и помогай после этого. Был бы поумнее, может быть и уму разуму бы научился, а так продолжай и дальше быдлокодить smile

Автор: NightmareZ 11.10.2009, 14:22
Medved, уйди пожалуйста из темы.

Автор: Medved 11.10.2009, 14:29
Испугался? 

Цитата(NightmareZ @  11.10.2009,  17:11 Найти цитируемый пост)
Пойди погуляй. Меня не интересует твои измышлизмы по сабжу. Я задал конкретный вопрос и хочу лишь ответа на него. 

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

Ты не ответил на мой вопрос:
Цитата(Medved @  11.10.2009,  07:40 Найти цитируемый пост)
Зачем тебе запрещать запуск двух копий приложения, и если уж запрещать (что не сложно реализовать черезь мьютексы, которые как раз для таких ситуаций и придуманы), то обязательно передавать параметры командной строки от одного приложения - к другому? Вот это мне сложно понять.
Откуда вообще взялось такое требование, и чем оно продиктовано?
Какие обстоятельства привели тебя к тому, что ты стал решать эту проблему (передавать командную строку)?

Видимо действительно нагородил...

Автор: Rohoss 11.10.2009, 14:45
Цитата(Medved @  11.10.2009,  14:05 Найти цитируемый пост)
Цитата(Rohoss @  11.10.2009,  14:53 )Medved, ИМХО, требования вполне адекватные… Мне кажется, подобным образом работают, например видеопроигрыватели, например тот же LightAlloy С таким же успехом можно убить певрое (ненужное приложение) и запустить вторую копию, в которую и передаются все данные. 

Зачем лишний раз загружать приложение? А если оно долго грузится… кому это надо?

Автор: Skynin 11.10.2009, 18:38
... а еще можно следить за буфером обмена, как то массово делают перехватыватели ссылок из браузера. Например EMule. Правда, тогда информация которая там есть потеряется, а нужно бы чтобы осталась, ведь пользователь не были инициатором записи чего-то в буфер обмена.

http://msdn.microsoft.com/en-us/library/system.windows.clipboard.aspx
http://www.codeproject.com/KB/shell/clipboard02.aspx

В любом случае логика рассуждений:

Первая копия приложения должна ждать присылаемое:
1. Что-то постоянно опрашивать (файл, "флаг", ...) - по моему расточительно и неумно для данной задачи.
2. Слушать, авось что пришлют. По TCP/UDP, IPC, ..., Clipboard, ..., .... Если приложение оконное - получить дескриптор окна первой копии и всунуть событие в очередь его событий. 

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

Потому что "Затем вторая. Вторая обнаруживает" - а если в это время запускается третья, как ей счирикиваться с двумя предыдущими? Или разрешено так - увидела что две уже копии - тогда все, просто молча и выключилась?

Цитата

Сокеты в этом деле плохи тем, что, например, какое-либо другое приложение может использовать тот же порт. 

Вот это то как раз рутинно решаемая проблема - при старте первой копии - ищется свободный порт(из диапазона, или начиная с попытки повеситься на порт по умолчанию) и записывается в такое место, из которого могут прочесть последующие копии программы.

Цитата

Как бы поступил ты?

Понятия не имею об задаче в целом. Может и задумался над вопросом "Какие обстоятельства привели меня к тому, что я стал решать эту проблему (передавать командную строку)?"

Автор: NightmareZ 12.10.2009, 04:28
Цитата(Skynin @  11.10.2009,  18:38 Найти цитируемый пост)
Понятия не имею об задаче в целом. Может и задумался над вопросом "Какие обстоятельства привели меня к тому, что я стал решать эту проблему (передавать командную строку)?"


Есть программа. Есть тип файлов, ассоциированный с этой программой. Пользователь даблкликает на файле - происходит запуск первого экзепляра программы, которому передаётся имя файла, по которому кликал юзверь, в командной строке. Если юзверь так же захочет открыть другой подобный файл, не закрывая программу, что получится? - Будет запущен второй экземпляр программы, которому будет передано имя файла. Мне нужно закрыть второй экземпляр, а первому передать инфу о том, что нужно открыть новый файл.... чтобы в первом экземпляре было загружено уже два файла.

Автор: Veitmen 12.10.2009, 05:07
Приветствую.

Я так понял это для вашего приложения - редактора? smile

Цитата(NightmareZ @  12.10.2009,  04:28 Найти цитируемый пост)
Есть программа. Есть тип файлов, ассоциированный с этой программой. Пользователь даблкликает на файле - происходит запуск первого экзепляра программы, которому передаётся имя файла, по которому кликал юзверь, в командной строке. Если юзверь так же захочет открыть другой подобный файл, не закрывая программу, что получится? - Будет запущен второй экземпляр программы, которому будет передано имя файла. Мне нужно закрыть второй экземпляр, а первому передать инфу о том, что нужно открыть новый файл.... чтобы в первом экземпляре было загружено уже два файла. 

Используйте маршалинг или тупо SendMessage.
Использовать Remoting, MSMQ, WCF or WebServices в данном случае бессмысленно, это и правда забивать микроскопом гвозди.

Копипаст с другого форума:
1. Посылка сообщений.
Один процесс вызывает SendMessage или PostMessage, другой процесс GetMessage. Все очень просто, передается 3 слова: сообщение, lparam и wparam.
2. Посылка прерываний (сигналов, если следовать терминологии *nix).
Один процесс вызывает какую-то функцию системы, передает ей PID и номер сигнала. Система прерывает выполнение программы-получателя и переходит к выполнению какой-то части программы, называемой обработчиком прерывания. Как только обработчик закончит выполнение — программы продолжает работать с той точки где была прервана.
3. Каналы ввода-вывода.
Все очень просто. Один процесс пишет в канал, другой читает. Можно передавать сколь угодно данных, на любой скорости. Проблема только в том, как соорудить этот канал данных. Можно при запуске переопределить STDIN и STDOUT или передать дескриптор канала по наследству, это если один процесс запускает другой. Можно использовать именованные каналы (если позволяет система). Можно использовать сокеты.
4. Файлы отображаемые в память.
Ни разу не пользовался. Но, как я понимаю некоторая часть памяти ставится в соответствие файлу чтение этой памяти приводит к чтению из файла, запись в память — к записи в файл.
5. Маршалинг (передача буфера через границы процессов средствами системы)
Идея простая, но описание грубое. Берем буфер (в памяти одного процесса) и передаем его системе. В другом процессе выделяем в виртуальной памяти место для буфера и запрашиваем у системы этот самый буфер. Система копирует данные из одного процесса в другой.

Автор: NightmareZ 12.10.2009, 05:42
Цитата(Veitmen @  12.10.2009,  05:07 Найти цитируемый пост)
Приветствую.

Взаимно smile

Цитата(Veitmen @  12.10.2009,  05:07 Найти цитируемый пост)
Я так понял это для вашего приложения - редактора?

Да smile

Цитата(Veitmen @  12.10.2009,  05:07 Найти цитируемый пост)
Используйте маршалинг или тупо SendMessage.

Маршалинг? А как его тут можно использовать?
А SendMessage не особо удобно.

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

Автор: Veitmen 12.10.2009, 06:48
Цитата(NightmareZ @  12.10.2009,  05:42 Найти цитируемый пост)
Маршалинг? А как его тут можно использовать?

Да и правда, маршалинг вам тут не поможет. Хотя поизвращаться можно. smile

Цитата(NightmareZ @  12.10.2009,  05:42 Найти цитируемый пост)
А SendMessage не особо удобно.

Безусловно, но если вы не хотели бы использовать файл то можно так.

Цитата(NightmareZ @  12.10.2009,  05:42 Найти цитируемый пост)
Сейчас сделал через временные файлы. Первый экземпляр мониторит директорию, находащуюся в LocalApplicationData, а остальные пишут туда инфо о тех файлах, которые нужно загрузить.

Нормальное решение. Так и нужно, и не надо тут что нить городить.

Удачи вам с вашим редактором. Слежу с интересом, надеюсь на фриварную версию. smile

Автор: NightmareZ 12.10.2009, 19:16
Цитата(Veitmen @  12.10.2009,  06:48 Найти цитируемый пост)
Удачи вам с вашим редактором.

Спасибо smile

Автор: nyxiscoo1 15.10.2009, 01:02
Есить готовое решение для VB .Net, но его можно использовать и в C#
http://www.codeproject.com/KB/cs/CSSIApp.aspx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)