Господа, уже очень долго мучаюсь с одной проблемой с .NET REMOTING, которая
просто перечёркивает её дальнейшее изучение...
Проблема общая, связанная с тем, что, конечно, легко осуществлять в ремотинг прямую связь, тоесть вызываеть
методы удалённого объекта, но вот как насчёт обратной связи??? когда сам объект активирует событие и вызывает
делегаты клиентов??? Везде в книгах, где я только не смотрел, ничего не написано про мою проблему...
Все обещают, что если напишешь прогу в этом стиле(как в примере), то обязательно будет работать...
В общем, на обратной связи у меня и проблема. Когда в клиентах производится подписание на событие
msg.NewMsg += new NewMsgEventHandler(MessageReceived);
возникает исключение : Type System.DelegateSerializationHolder and the types derived from it (such as System.DelegateSerializationHolder) are not permitted to be deserialized at this security level.
для примера я наклепал код:
(Все сборки со строгим именем, в программах клиент и сервер установил режим полного доверия (Проект->Properties->
Security->Enable ClickOnce Security Settings->This is a full trust application);
1. Sdk.dll:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting;
namespace Sdk
{
public delegate void NewMsgEventHandler(string Message);
public class Messager : MarshalByRefObject
{
public event NewMsgEventHandler NewMsg;
public void SendMessage(string msg)
{
NewMsg(msg);
}
}
}
2. Client.exe:
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using Sdk;
namespace Client
{
class Program
{
public static void MessageReceived(string msg)
{
Console.WriteLine("\n"+msg);
}
static void Main(string[] args)
{
ChannelServices.RegisterChannel(new TcpChannel(0));
RemotingConfiguration.RegisterWellKnownClientType(typeof(Messager), "
tcp://localhost:4000/Messager");
Messager msg = new Messager();
msg.NewMsg += new NewMsgEventHandler(MessageReceived);
string message = "";
while (message != "exit")
{
Console.Write("Enter message:");
message = Console.ReadLine();
msg.SendMessage(message);
}
}
}
}
3. Server.exe :
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using Sdk;
namespace Server
{
class Program
{
static void Main(string[] args)
{
TcpChannel channel = new TcpChannel(4000);
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(Messager), "Messager",
WellKnownObjectMode.Singleton);
Console.WriteLine("Type Enter to exit...");
Console.ReadLine();
}
}
}
--------------------------------------------------!!!Очень буду благодарен !!!-----------------------------------
28.02.06 13:32: Перенесено модератором из 'Сети, сокеты, протоколы' — Хитрик Денис