Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/72: Рейтинг темы: голосов - 72, средняя оценка - 4.88
the_login
0 / 0 / 0
Регистрация: 10.11.2009
Сообщений: 6
1

Взаимодействие между двумя .NET приложениями

28.06.2010, 22:41. Просмотров 14903. Ответов 14
Метки нет (Все метки)

Всем доброго дня!

Подскажите, что и как лучше использовать для передачи данных между двумя .NET приложениями.

Мне необходимо с разной временной периодичностью (минуты) обмениваться небольшими объемами данных (десятки килобайт) между двумя приложениями. Идеально была бы возможность подписываться на события другого приложения, и обращаться к объектам в другом приложении.

Начал разбираться с COM, но не покидает ощущение что есть способы проще.

Спасибо!
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.06.2010, 22:41
Ответы с готовыми решениями:

Взаимодействие между двумя приложениями
Я читал возможные варианты и из того, что нашел, если верно понял не подходит ничего (отрицать не...

Общение между двумя приложениями
В процессе разработки приложения wpf я окончательно убедился что моя программа не совместима с wpf...

Как создать сообщение между двумя устройствами via .NET?
Столкнулся с необычной задачей: нужно написать приложение, которое будет отправлять сбщ на другое...

Взаимодействие с приложениями
Здравствуйте. Хочу сделать программу, которая будет взаимодействовать с разными приложениями. К...

Сериализация между приложениями
В MS VS 2010 создал решение и в нём 2 проекта: Client и Server. В каждом расположил класс...

14
Lolcht0
123 / 121 / 0
Регистрация: 30.03.2009
Сообщений: 766
29.06.2010, 00:24 2
вот как-то так...
0
the_login
0 / 0 / 0
Регистрация: 10.11.2009
Сообщений: 6
29.06.2010, 10:52  [ТС] 3
Интересно, но TCP мне использовать нежелательно (забыл сказать), даже в формате localhost, поскольку конечные приложения будут стоять на сервере где я не контролирую файервол.
0
mik-a-el
Администратор
74698 / 43833 / 243
Регистрация: 10.04.2006
Сообщений: 12,860
29.06.2010, 11:07 4
Lolcht0, ремотинг - устаревшая технология.
the_login, используйте WCF.
Цитата Сообщение от the_login Посмотреть сообщение
поскольку конечные приложения будут стоять на сервере где я не контролирую файервол.
Открывать определенные порты все равно придется.
2
29.06.2010, 11:07
the_login
0 / 0 / 0
Регистрация: 10.11.2009
Сообщений: 6
29.06.2010, 11:19  [ТС] 5
mik-a-el, да, вот уже начал читать msdn.

Если есть под рукой какае-то более правильные ссылки, буду благодарен за наводку
0
mik-a-el
Администратор
74698 / 43833 / 243
Регистрация: 10.04.2006
Сообщений: 12,860
29.06.2010, 13:05 6
the_login, кроме мсдн можно еще книги поискать
0
Profyev
3 / 3 / 0
Регистрация: 30.06.2010
Сообщений: 21
30.06.2010, 01:53 7
Использовать "глобальную" программу-менеджер, через которую и будут пакеты бегать
0
mik-a-el
Администратор
74698 / 43833 / 243
Регистрация: 10.04.2006
Сообщений: 12,860
30.06.2010, 09:05 8
Цитата Сообщение от Profyev Посмотреть сообщение
Использовать "глобальную" программу-менеджер, через которую и будут пакеты бегать
Это называется wcf-сервисом...
0
Profyev
3 / 3 / 0
Регистрация: 30.06.2010
Сообщений: 21
30.06.2010, 20:14 9
согласен
0
jupy
15 / 15 / 1
Регистрация: 01.07.2010
Сообщений: 33
02.07.2010, 00:03 10
Вообще-то есть десятки способов, например просто через файл передавать данные. Можно через memory mapped file. Можно использовать mail slots. Но пожалуй наиболее стандартный способ - named pipes. Кстати wcf поддерживает named pipes, так что проще всего будет сделать именно так.
1
Mikant
1291 / 964 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
02.07.2010, 00:23 11
jupy, не надо так жестко в таком простом случае
не надо пайпов, и тем более неуправляемых куч
самый простой способ - сокеты... уже сам нарывался на эти траблы, помогло
0
jupy
15 / 15 / 1
Регистрация: 01.07.2010
Сообщений: 33
02.07.2010, 13:11 12
Цитата Сообщение от Mikant Посмотреть сообщение
jupy, не надо так жестко в таком простом случае
не надо пайпов, и тем более неуправляемых куч
самый простой способ - сокеты... уже сам нарывался на эти траблы, помогло
Чего же здесь жесткого? Самый простой способ (и пожалуй стандартный метод обмена данными между процессами на одной машине) - это как раз пайпы. Тогда не будет никаких траблов с файрволлами. Кроме того пайпы работают быстрее, а интерфейс пайпов - это просто стандартные потоки (Stream).

Если же делать на WCF, то транспорт вас вообще не будет интересовать, т.к. в этом случае вы пишите один код, а далее настройками в файле конфигурации определяете какой транспорт использовать: named pipes, tcp, msmq, http или еще какой. Можно будет даже через интернет обмениваться данными.

Про неуправляемые кучи я ничего не говорил.
0
Mikant
1291 / 964 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
02.07.2010, 23:40 13
признаЮ, был неправ. слишком давно их трогал
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
using System;
using System.IO.Pipes;
using System.Net;
using System.Net.Sockets;
using System.Threading;
 
namespace SocketVsPipe {
    class Program {
 
        public const int BufferLength = 100000000;
 
        static void Main(string[] args) {
 
            Transmitter transmitter = null;
            Receiver receiver = null;
 
            new Action(() => {
                transmitter = new Transmitter();
            }).BeginInvoke(null, null);
 
            new Action(() => {
                receiver = new Receiver();
            }).BeginInvoke(null, null);
 
            Transmitter.ConnectionEstablishedEvent.WaitOne();
 
            receiver.BeginReceive();
            transmitter.BeginTransmit(receiver.SocketEndPoint);
 
            Console.ReadKey();
 
            transmitter.Dispose();
            receiver.Dispose();
        }
    }
 
    public class Transmitter : IDisposable {
 
        private NamedPipeServerStream pipe = new NamedPipeServerStream("MyPipe", PipeDirection.Out);
        private Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 
        public Transmitter() {
            socket.Bind(new IPEndPoint(IPAddress.Loopback, 12345));
            socket.Listen(0x7fffffff);
            socket = socket.Accept();
            pipe.WaitForConnection();
            ConnectionEstablishedEvent.Set();
        }
 
        internal static ManualResetEvent ConnectionEstablishedEvent = new ManualResetEvent(false);
 
        public void BeginTransmit(EndPoint socketEp) {
            byte[] data1 = new byte[Program.BufferLength];
            byte[] data2 = new byte[Program.BufferLength];
            pipe.BeginWrite(data1, 0, data1.Length, null, null);
            socket.BeginSendTo(data2, 0, data2.Length, SocketFlags.None, socketEp, null, null);
        }
 
        public void Dispose() {
            socket.Close();
            pipe.Dispose();
        }
    }
 
    public class Receiver : IDisposable {
 
        private NamedPipeClientStream pipe = new NamedPipeClientStream(".", "MyPipe", PipeDirection.In);
        private Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 
        public EndPoint SocketEndPoint { get { return socket.LocalEndPoint; } }
 
        public Receiver() {
            socket.Connect(new IPEndPoint(IPAddress.Loopback, 12345));
            pipe.Connect();
        }
 
        public void BeginReceive() {
            DateTime dt = DateTime.Now;
            byte[] sockBuffer = new byte[Program.BufferLength];
            byte[] pipeBuffer = new byte[Program.BufferLength];
            socket.BeginReceive(sockBuffer, 0, sockBuffer.Length, SocketFlags.None, new AsyncCallback(result => { Console.WriteLine("Socket: " + (DateTime.Now - dt).TotalMilliseconds + " мс"); }), null);
            pipe.BeginRead(pipeBuffer, 0, pipeBuffer.Length, new AsyncCallback(result => { Console.WriteLine("Pipe: " + (DateTime.Now - dt).TotalMilliseconds + " мс"); }), null);
        }
 
        public void Dispose() {
            socket.Close();
            pipe.Dispose();
        }
    }
}
результат:
Pipe: 470.0269 мс
Socket: 1341.0767 мс

Добавлено через 2 минуты
Цитата Сообщение от jupy Посмотреть сообщение
Про неуправляемые кучи я ничего не говорил.
а COM куча управляема чтоль? это ж то же самое
2
mak326428
43 / 43 / 3
Регистрация: 04.02.2011
Сообщений: 199
22.08.2011, 09:08 14
пробовал через сокеты... localhost, конечно очень хорошо, но если порт занят..
0
Host
0 / 0 / 0
Регистрация: 06.01.2015
Сообщений: 1
29.08.2011, 03:36 15
Цитата Сообщение от mik-a-el Посмотреть сообщение
the_login, кроме мсдн можно еще книги поискать
Всегда нравятся такие конкретные и самое главное точные ответы на форумах

Есть технология DDE (native) и netDDE (dotNet)
0
29.08.2011, 03:36
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2011, 03:36

Обмен данных между приложениями
Добрый день! Такая задача, клиент базы данных Oracle стоить 32 битный, а приложение которое должно...

Передача объектов между приложениями
Есть ли способ напрямую передать объекты из одного .NET приложения в другое? Объём достаточно...

Универсальный обмен данными между приложениями
Посоветуйте, пожалуйста, подход для решения следующей штуки: Передача данных из приложенияА (C#) в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru