Benutzer mit den meisten Antworten
.NET Remoting und Funktionsüberladung

Frage
-
Hi,
ein Remoting-Objekt verfügt über überladene Funktionen, z.B.
ArrayList Get();
ArrayList Get(int i);
ArrayList Get(int i, string a);
Beim Aufruf von einer dieser Methoden aus einem anderen Prozess wird eine Exception geworfen mit der Fehlerbeschreibung:
"Das Objekt mit dem Typ "System.Type[]" kann nicht in den Typ "System.Int32" konvertiert werden."
Bei Funktionen, für welche es keine Überladungen gibt, tritt das Problem nicht auf.
Handelt es sich hierbei um ein generelles .NET Remoting Problem oder gibt es bei der Verwendung von Funktionsüberladung bei Remoting-Objekten noch etwas besonderes zu beachten?
Viele Grüße
Christian
Antworten
-
Hallo Marcel,
Hallo Thomas,
mit dem Beispiel-Code tue ich mir ein bischen schwer. Es geht um die Implementierung unseres eigenen Frameworks. Es wurde inzwischen "gelöst", indem die Funktionen umbenannt wurden. Nicht sehr schön.
Viele Grüße
Christian
- Als Antwort vorgeschlagen Marcel RomaModerator Donnerstag, 11. November 2010 18:03
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 19. November 2010 17:21
Alle Antworten
-
Hallo Christian
bei dieser Art Exception tippe ich auf ein 'Ungleichgewicht' (Versionsunterschiede) der Metadata,
also zB des gemeinsamen Assembly oder Proxy das du zwischen Server und Client-Projekt teilst.
Andernfalls bitte vollständige Details zur Exception, inkl Stack. -
Hallo Christian,
kann mit mehreren auch ganz simplen Dingen zusammen hängen ... ist noch etwas wenig Code, um das zu beurteilen.
Ein paar Möglichkeiten:[objekt with typ can not be converted Remoting - Google-Suche]
In der ArrayList sind ansonsten auch immer bestimmte Typen.
Diese müssen aber letztlich bei der Übertragung "in der Leitung" serialisiert werden und man kann dies nicht immer mit allen Typen machen.
[Serialization/Deserialization between two apps.]
http://www.netframeworkdev.com/net-remoting-runtime-serialization/serializationdeserialization-between-two-apps-43904.shtml
Achte ggf. insbesondere auch auf das XmlInclude und Serializable Attribut.BTW: ab .NET 4.0 würde ich auf jeden Fall eher zu WCF als .NET Remoting raten (bei 3.0 noch nicht unbedingt).
ciao Frank -
Hallo Christian,
Mir sieht das sehr nach einem einfachen, serverseitigen System.InvalidCastException-Fehler aus. Wahrscheinlich soll die ArrayList serverseitig anhand der Parameter (int i, string a) gefiltert werden. Beim Filtern wird vermutlich eine cast/Konvertierung gemacht und da man von System.Type nicht zu Int32 konvertieren kann, wird eine Ausnahme geworfen.
Zeig uns doch mal bitte den Code von Get(int i).
BTW: Ab .NET 3.0 nimmt man für Neuentwicklungen, die prozessübergreifendes Remoting benötigen, gewöhnlich WCF. Remoting fristet nur noch ein Nischendasein beim Remoten zwischen verschiedenen AppDomains desselben Prozesses.Gruß
Marcel -
Hi Marcel,
vielen Dank für Deine Hilfe!
Wahrscheinlich soll die ArrayList serverseitig anhand der Parameter (int i, string a) gefiltert werden. Beim Filtern wird vermutlich eine cast/Konvertierung gemacht und da man von System.Type nicht zu Int32 konvertieren kann, wird eine Ausnahme geworfen.
Das Problem tritt nur auf, wenn der Remote-Aufruf über Rechnergrenzen geschieht. Das Problem tritt nicht auf, wenn der Aufruf auf einem Rechner, d.h. innerhalb eines Prozesses ausgeführt wird.
Viele Grüße
Christian
-
Das Problem tritt nur auf, wenn der Remote-Aufruf über Rechnergrenzen geschieht. Das Problem tritt nicht auf, wenn der Aufruf auf einem Rechner, d.h. innerhalb eines Prozesses ausgeführt wird.
Christian,
zur Sicherheit (aber sehe ich kaum als Ursache):
welche Remoting Channel und Formatter werden denn eingesetzt? -
Hallo Christian,
Hallo ThomasChristian schrieb:
Das Problem tritt nur auf, wenn der Remote-Aufruf über Rechnergrenzen geschieht. Das Problem tritt nicht auf, wenn der Aufruf auf einem Rechner, d.h. innerhalb eines Prozesses ausgeführt wird.
Ohne Code und/oder StackTrace, stochern wir im Dunkeln.
Es könnte:
- ein Serialisierungs-/Deserialisierungsproblem sein, es könnte auch
- einfach nur die falsche Version/Codebasis der [Server].dll sein an die clientseitig gebunden wird, oder
- die falsche Assembly für die verwendete Interface (wenn auf Interface gecastet wird)
- usw.Mir fehlen halt relevante Anhaltspunkte.
Gruß
Marcel -
Ohne Code und/oder StackTrace, stochern wir im Dunkeln.
Marcel - klar,
wobei eines kann man wohl schon jetzt feststellen:
ein "generelles .NET Remoting Problem" gibt es mit so überladenen Funktionen nicht, entsprechender Code läuft hier von Anfang an fehlerfrei. -
Hallo Marcel,
Hallo Thomas,
mit dem Beispiel-Code tue ich mir ein bischen schwer. Es geht um die Implementierung unseres eigenen Frameworks. Es wurde inzwischen "gelöst", indem die Funktionen umbenannt wurden. Nicht sehr schön.
Viele Grüße
Christian
- Als Antwort vorgeschlagen Marcel RomaModerator Donnerstag, 11. November 2010 18:03
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 19. November 2010 17:21
-
Hallo Christian,
mit dem Beispiel-Code tue ich mir ein bischen schwer. Es geht um die Implementierung unseres eigenen Frameworks. Es wurde inzwischen "gelöst", indem die Funktionen umbenannt wurden. Nicht sehr schön.
Dass Du denn Code nicht veröffentlichen willst, kann ich gut verstehen. Aber ein StackTrace wäre doch angebracht, zumal zukünftige Besucher - die eventuell ein ähnliches Problem haben - mehr von dieser Diskussion haben könnten.
Gruß
Marcel -
Hi Marcel,
anbei der StackTrace:
Das Objekt mit dem Typ "System.Type[]" kann nicht in den Typ "System.Int32" konvertiert werden.
Server stack trace:
bei System.RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr)
bei System.Reflection.RtFieldInfo.InternalSetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture, Boolean doVisibilityCheck, Boolean doCheckConsistency)
bei System.Reflection.RrFieldInfo.InternalSetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture, Boolean doVisibilityCheck)
bei System.Runtime.Serialization.FormatterServices.SerializationSetValue(MemberInfo fi, Object target, Object value)
bei System.Runtime.Serialization.FormatterServices.PopulateObjectMembers(Object obj, MemberInfo[] members, Object[] data)
bei System.Runtime.Serialization.Soap.ReadObjectInfo.PopulateObjectMembers()
bei System.Runtime.Serialization.Soap.ObjectReader.ParseObjectEnd(ParseRecord pr)
bei System.Runtime.Serialization.Soap.ObjectReader.ParseMemberEnd(ParseRecord pr)
bei System.Runtime.Serialization.Soap.ObjectReader.Parse(ParseRecord pr)
bei System.Runtime.Serialization.Soap.SoapHandler.EndElement(String prefix, String name, String urn)
bei System.Runtime.Serialization.Soap.SoapParser.ParseXml()
bei System.Runtime.Serialization.Soap.SoapParser.Run()
bei System.Runtime.Serialization.Soap.ObjectReader.Deserialize(HeaderHandler handler, ISerParser serParser)
bei System.Runtime.Serialization.Soap.SoapFormatter.Deserialize(Stream serializationStream, HeaderHandler handler)
bei System.Runtime.Remoting.Channels.CoreChannel.DeserializeSoapResponseMessage(Stream inputStream, IMessage requestMsg, Header[] h, Boolean bStringBinding)
bei System.Runtime.Remoting.Channels.SoapClientFormatterSink.DeserializeMessage(IMethodCallMessage mcm, ITransportHeaders headers, Stream stream)
bei System.Runtime.Remoting.Channels.SoapClientFormatterSink.SyncProcessMessage(IMessage msg)
Exception rethrown at [0]:
bei System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
bei System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)Gruß
Christian