Entwickler-Ecke
Andere .NET-Sprachen - Remoting bringt Exception
syox - Do 17.11.05 10:59
Titel: Remoting bringt Exception
Hi, habe hier eine RemotingKlasse die nich will...
Nach der Erstellung eines Interface (gepackt in ein Assembly) hat soweit alles funktioniert.
Die Programme lassen sich kompilieren und laufen, bis eine Funktion der RemotingKlasse aufgerufen wird...
Eine Exception sagt mir: "
Attempted to create well-known object of type TESRemoting.ITESRemoting. Well known objects must derive from the MarshalByRefObject class."
Das Interface der RemotingKlasse:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| unit TESRemoting;
interface uses System.Data, System.Data.OleDb;
type ITESRemoting = Interface function RecieveMessageFromServer() : System.String; procedure SendMessageToServer(theMessage : System.String); end;
implementation
end. |
Hier die RemotingKlasse des Servers
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| ... uses ... TESRemoting ... ... TES_Interface = class(MarshalByRefObject, ITESRemoting) strict protected procedure Finalize; override; private public constructor Create; destructor Destroy; override; procedure SendMessageToServer(theMessage : System.String); function RecieveMessageFromServer() : System.String; end; |
die Registrierung des Remoting sieht so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| rocedure TWinForm.bStartServer_Click(sender: System.Object; e: System.EventArgs); begin Self.Protocol('Server started.'); Channel := HTTPChannel.Create(8888); ChannelServices.RegisterChannel(Channel); RemotingConfiguration.ApplicationName := 'test'; RemotingConfiguration.RegisterWellKnownServiceType(typeof(ITESRemoting), 'testme.soap',WellKnownObjectMode.Singleton); LifetimeServices.LeaseTime := TimeSpan.FromSeconds(5); LifetimeServices.RenewOnCallTime := TimeSpan.FromSeconds(5); end; |
Die Exception verstehe ich nich so ganz, da die RemotingKlasse doch von MarshalByRefObject abgeleitet wird....
:(
hier nochmal die Exception:
"
Attempted to create well-known object of type TESRemoting.ITESRemoting. Well known objects must derive from the MarshalByRefObject class."
opfer.der.genauigkeit - Fr 18.11.05 09:39
Hallo,
für ein Interface gilt folgendes:
a) die GUID (kann man mit Alt + Shift + G) erstellen
b) Interfaces werden von IUnknown bzw. Plattformunabhängig (bitte wenn falsch korrigieren)
von IInterface abgeleitet.
c) Interfaces werden nicht mit dem Bezeichner
ITest = class(TTest)
sondern mit
ITest = interface(IInterface) abgeleitet.
d) Interface delegieren
Delphi-Quelltext
1: 2:
| property MyInterface: IMyInterface read FMyInterface implements IMyInterface; |
Soviel zu meinem bescheidenen Wissen.
Lies dir doch dazu mal in der Hilfe den entsprechenden Abschnitt durch, das dürfte dir weiterhelfen.
Da steht das auch wesentlich detailierter.
MfG und grüner Schnee. ;)
syox - Fr 18.11.05 12:06
opfer.der.genauigkeit hat folgendes geschrieben: |
Hallo,
für ein Interface gilt folgendes:
a) die GUID (kann man mit Alt + Shift + G) erstellen
|
Leider kann ich nicht nachvollziehen was du da meinst.
opfer.der.genauigkeit hat folgendes geschrieben: |
b) Interfaces werden von IUnknown bzw. Plattformunabhängig (bitte wenn falsch korrigieren)
von IInterface abgeleitet.
|
Das Interface sollte nicht abgeleitet werden,
die Klasse TES_Interface soll von MarshalbyRefObject abgeleitet werden und dabei das Interface ITESRemoting implementieren:
TES_Interface = class(MarshalByRefObject, ITESRemoting);
opfer.der.genauigkeit hat folgendes geschrieben: |
c) Interfaces werden nicht mit dem Bezeichner
ITest = class(TTest)
sondern mit
ITest = interface(IInterface) abgeleitet.
|
Gibt es in Delphi eigentlich Mehrfachvererbung oder nur eine Elternklasse und Interfaces:
class(Vaterklasse, Interface1, Interface2,...);
opfer.der.genauigkeit hat folgendes geschrieben: |
d) Interface delegieren Delphi-Quelltext 1: 2:
| property MyInterface: IMyInterface read FMyInterface implements IMyInterface; |
|
Hier weiß ich auchnicht was delegieren eines Interfaces heißt, wird wahrscheinlich auch recht wenig mit dem Problem des Threads zusammen hängen.
opfer.der.genauigkeit hat folgendes geschrieben: |
Soviel zu meinem bescheidenen Wissen.
Lies dir doch dazu mal in der Hilfe den entsprechenden Abschnitt durch, das dürfte dir weiterhelfen.
Da steht das auch wesentlich detailierter.
MfG und grüner Schnee. ;) |
Danke für die Gedankenanstöße!! Dein "bescheidenes" Wissen hat wenigstens etwas Licht ins Dunkel gebracht.
Die Hilfe im Delphi 2005 Professional hat mich bisher nur Text lesen lassen, leider ohne heiße Spur zur Lösung meines Problems :(
opfer.der.genauigkeit - Fr 18.11.05 12:19
Hallo,
in der Hilfe gibt es eine Doku, die genau das beschreibt und besser was ich dir als Kurzfassung geschrieben habe.
In der Delphi 2005 Hilfe diesen Link angeben:
[url]ms-help://borland.bds3/bds3guide/html/ObjectInterfacesOV.htm[/url]
syox - Mo 21.11.05 11:16
Danke für die Hilfe,
hab ein wenig gelesen und meine Fehler gefunden:
Delphi-Quelltext
1: 2:
| RemotingConfiguration.RegisterWellKnownServiceType(typeof(ITESRemoting), 'testme.soap',WellKnownObjectMode.Singleton); |
muss heißen:
Delphi-Quelltext
1: 2:
| RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteMessages), sAppname + '.soap', WellKnownObjectMode.Singleton); |
Problem war: Ich hatte beim Server das _Interface_ als WellKnownService eintragen lassen und nicht die implementierte Klasse.
Also Serverseitig die Klasse als WellKnownService eintragen und Clientseitig das Interface (Proxyklasse) verwenden.
Delphi-Quelltext
1: 2:
| RemoteMessage := Activator.GetObject(typeof(IMessages), 'http://localhost:8888/testme.soap') as IMessages; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!