Hi zusammen,
ich spiele gerade mit dem Remoting-Tutorial von Crazy Weasel herum. Ich habe das Client-GUI um eine Listbox erweitert, die mir eine Auflistung aller am Server angemeldeten Clients zeigt. Als Datasource der Listbox dient ein DataTable, welches ich über ein Member des Server-Objektes abrufe. Soweit funktioniert auch alles gut.
Nun möchte ich die Listbox immer dann aktualisieren, wenn sich ein Client am Server anmeldet oder abmeldet. Dazu habe ich das Interface-Assembly um ein Delegate und ein Event erweitert:
Im Server-Objekt habe ich das Event ebenfalls implementiert:
Im Client-Objekt mache ich die Ereignis-Behandlung:
Wenn ich nun versuche den Client am Server anzumelden, bringt der Client die Exception, die ich diesem Posting unten beigefügt habe. Der Fehler tritt an der Stelle auf, an der ich die Ereignisbehandlung aufrufe. Leider erkenne ich nicht, was ich falsch gemacht habe. Ich wäre froh und dankbar, wenn ihr mir helfen könnten.
Viele Grüße, Jo
************** Ausnametext **************
System.Runtime.Serialization.SerializationException: Die Assembly Client, Version=1.0.1822.29431, Culture=neutral, PublicKeyToken=null kann nicht gefunden werden.
Server stack trace:
at System.DelegateSerializationHolder.GetDelegate(DelegateEntry de)
at System.DelegateSerializationHolder.GetRealObject(StreamingContext context)
at System.Runtime.Serialization.ObjectManager.ResolveObjectReference(ObjectHolder holder)
at System.Runtime.Serialization.ObjectManager.DoFixups()
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, IMethodCallMessage methodCallMessage)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, IMethodCallMessage methodCallMessage)
at System.Runtime.Remoting.Channels.CoreChannel.DeserializeBinaryRequestMessage(String objectUri, Stream inputStream, Boolean bStrictBinding, TypeFilterLevel securityLevel)
at System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders, Stream& responseStream)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at Interfaces.IServer.add_OnClientListChange(ClientListChange value)
at Client.client.connect() in c:\Dokumente und Einstellungen\geske.INTERN\Desktop\RemotingTutorial\Client\client.cs:line 191
at Client.client.btnConnect_Click(Object sender, EventArgs e) in c:\Dokumente und Einstellungen\geske.INTERN\Desktop\RemotingTutorial\Client\client.cs:line 215
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
************** Geladene Assemblys **************
ich spiele gerade mit dem Remoting-Tutorial von Crazy Weasel herum. Ich habe das Client-GUI um eine Listbox erweitert, die mir eine Auflistung aller am Server angemeldeten Clients zeigt. Als Datasource der Listbox dient ein DataTable, welches ich über ein Member des Server-Objektes abrufe. Soweit funktioniert auch alles gut.
Nun möchte ich die Listbox immer dann aktualisieren, wenn sich ein Client am Server anmeldet oder abmeldet. Dazu habe ich das Interface-Assembly um ein Delegate und ein Event erweitert:
Code:
using System;
using System.Data;
namespace Interfaces
{
public delegate void ClientListChange(); // Die Ereignis-Deklaration
public interface IServer
{
void _login (IClient client);
void _logout (IClient client);
bool _sendText (string text, IClient client);
DataTable ClientList { get; }
event ClientListChange OnClientListChange; // Hier ist das Event zum Anzeigen der angemeldeten Clients
}
public interface IClient
{
Guid _guid { get; }
string _nick { get; }
void _setText (string text);
}
}
Im Server-Objekt habe ich das Event ebenfalls implementiert:
Code:
...
public event ClientListChange OnClientListChange;
...
Im Client-Objekt mache ich die Ereignis-Behandlung:
Code:
...
this.remServer = (IServer) Activator.GetObject(typeof(IServer), "tcp://" + txtIP.Text.Trim() + ":" + txtPort.Text.Trim() + "/chat.rem");
this.remServer.OnClientListChange += new ClientListChange(LoadClientList); // Hier ist die Ereignisbehandlung
this.remServer._login(myClient);
Wenn ich nun versuche den Client am Server anzumelden, bringt der Client die Exception, die ich diesem Posting unten beigefügt habe. Der Fehler tritt an der Stelle auf, an der ich die Ereignisbehandlung aufrufe. Leider erkenne ich nicht, was ich falsch gemacht habe. Ich wäre froh und dankbar, wenn ihr mir helfen könnten.
Viele Grüße, Jo
************** Ausnametext **************
System.Runtime.Serialization.SerializationException: Die Assembly Client, Version=1.0.1822.29431, Culture=neutral, PublicKeyToken=null kann nicht gefunden werden.
Server stack trace:
at System.DelegateSerializationHolder.GetDelegate(DelegateEntry de)
at System.DelegateSerializationHolder.GetRealObject(StreamingContext context)
at System.Runtime.Serialization.ObjectManager.ResolveObjectReference(ObjectHolder holder)
at System.Runtime.Serialization.ObjectManager.DoFixups()
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, IMethodCallMessage methodCallMessage)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, IMethodCallMessage methodCallMessage)
at System.Runtime.Remoting.Channels.CoreChannel.DeserializeBinaryRequestMessage(String objectUri, Stream inputStream, Boolean bStrictBinding, TypeFilterLevel securityLevel)
at System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders, Stream& responseStream)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at Interfaces.IServer.add_OnClientListChange(ClientListChange value)
at Client.client.connect() in c:\Dokumente und Einstellungen\geske.INTERN\Desktop\RemotingTutorial\Client\client.cs:line 191
at Client.client.btnConnect_Click(Object sender, EventArgs e) in c:\Dokumente und Einstellungen\geske.INTERN\Desktop\RemotingTutorial\Client\client.cs:line 215
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
************** Geladene Assemblys **************