Межпроцессное общение в .net

  • Автор темы Real-Mulik
  • Дата начала
Статус
Закрыто для дальнейших ответов.
R

Real-Mulik

Гость
#1
У меня есть служба, написанная в .NET, однако хотелось бы создать интерфейс, в виде формы,который мог бы отображать текущее состояние службы... Фактически в идеале надо, чтобы другой процесс (форма должна независимо от процесс открывать и закрываться пользователем) получил доступ к потоку служы и ко всем его объектам.. Однако подозреваю что такое не возможно. Поэтому хотелось бы хотябы реализовать сообщения от служы к форме и, возможно, обратно. В своих поисках я наткнулся на .NET Remote, однако у меня не стоит задачи создать распределенное приложение.. и создание объектов службы по идее не должно происходить из формы... форма должна получить доступ у уже существующим объектам... вобщем как такое можно замутить?
 
R

Real-Mulik

Гость
#2
Отвечаю сам себе.

Да такое возможно. Для этого надо взять: Сервер (прога, которая работает, в маем случае это служба), Ресурс(класс, к к которому будем получать доступ), Клиент (тот кто будет получать доступ).

1. СЕРВЕР: В данном премере я взял за WindowsApplication. Не забудьте подключить дополнительно библиотеку System.Runtime.Remoting.dll. На форме висят 2 кнопки и TextBox
Код:
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels.Http;

public partial class Server : Form
{
public Server()
{
InitializeComponent();
}
Modification M;
private void button1_Click(object sender, EventArgs e)
{
HttpChannel chanel = new HttpChannel(8080);
ChannelServices.RegisterChannel(chanel);
M = new Modification();
M.Midif("Best");
ObjRef obj = RemotingServices.Marshal(M, "Muri");
this.Text = ("ObjRef.URI: " + obj.URI);
textBox1.Text = "Running. Press Enter to end publication.";
}
private void button2_Click(object sender, EventArgs e)
{
textBox1.Text = M.text;
}
2. Класс с которым будем работать. Я его положил в отдельный файл в приложение сервера.
Код:
namespace WA
{
public class Modification:MarshalByRefObject
{
public string text = "";
public void Midif(string str)
{
text = str;
}
}
}
3. Клиент. 2-ое приложение WindowsApplication, которое никоеим боком к перову не касается.. лишь с отличем что надо добавть ссылку на тот класс который будм брать т.е. на приложение СЕРВЕР для доступа к классу Modification. Класс можно положить в DLL и сделать Reference к ниму 2-х приложений. На форме висят: кнопка и Label.
Код:
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Channels.Http;
using WA;

namespace ClientW
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
HttpChannel chanel = new HttpChannel(0);
ChannelServices.RegisterChannel(chanel);
RemotingConfiguration.RegisterWellKnownClientType(Type.GetType("WA.Modification, WA"),"http://localhost:8080/Muri");
Modification M = new Modification();
label1.Text = M.text;
M.Midif("ffff");
}
}
}
данная штука позволяет получить доступ к экземпляру объекта сразу двум(!) процессам, что позволяет быстро и легко настроить между ними общение... однако данный пример показывает лишь простейший пример.. на самом деле все на сного круче :)
 
K

karlito

Гость
#3
смотри COM технология в .NET. Правда, немножко процесс разворачивание усложниться.

.NET Remoting - это слишком круто для такой задачи. да и не надо.
 
R

Real-Mulik

Гость
#4
COM в .NET? Нет спасибо.. я уж как-нить так...
 
K

karlito

Гость
#5
Поковыряй работу по IPC каналам на Remoting. Не так тяжело получиться.
В следующей версии фреймворка 3.5, если не ошибаюсь с версией, появится API на управляемом коде для работы по IPC каналам.
 
Статус
Закрыто для дальнейших ответов.