SO WIRD'S GEMACHT: Ein Objekt mithilfe von Visual Basic .NET auf einen Remoteserver über eine Referenz marshallen

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 301112 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel wurde zuvor veröffentlicht unter D301112
Dieser Artikel wurde archiviert. Er wird im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.
Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base:
301112 HOW TO: Marshal an Object to a Remote Server by Reference Using Visual Basic .NET
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Dieser Artikel beschreibt, wie Sie ein Objekt über eine Referenz auf einen Remoteserver marshallen. Wenn Sie ein Objekt über eine Referenz marshallen, erstellt die Laufzeit einen transparenten Proxy, damit der Server Rückrufe zum Objekt auf dem Client ausführen kann. Das einzige Element, das zum Server gesendet wird, ist der Proxy. Der Proxy marshallt die Rückrufe zum Client.

Dieser Artikel umfasst drei Abschnitte: Das Serverobjekt, die Serveranwendung und die Clientanwendung. Grundlage für diesen Artikel sind folgende Artikel der Microsoft Knowledge Base:
300951 HOW TO: Create a Remote Server Using Visual Basic .NET
300943 HOW TO: Create Client Access to Remote Server

Voraussetzungen

In den folgenden Produkten sind die empfohlene Hardware, Software, Netzwerkinfrastruktur und Kenntnisse sowie erforderliche Service Packs beschrieben:
  • Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server oder Windows NT 4.0 Server
  • Visual Studio .NET
Sie sollten über Kenntnisse zu folgenden Technologien verfügen, bevor Sie Ihren ersten Versuch starten:
  • Visual Studio .NET
  • Grundlegende Netzwerkkenntnisse

Wie Sie ein Remoteserver-Objekt erstellen, indem Sie Objekte übermitteln

Der erste Schitt in der Entwicklung Ihrer Serveranwendung besteht darin, das Serverobjekt zu erstellen. Das Serverobjekt ist das Element, das von der Clientanwendung instanziiert wird, und mit dem die Clientanwendung auf dem Servercomputer kommuniziert. Hierzu verwendet die Clientanwendung ein Proxyobjekt, das auf dem Client erstellt wurde. In unserem Beispiel wird der Name Ihres Serverobjekts HelloServer lauten, und es wird sich in einer Klassenbibliothek (DLL) befinden. In dem gleichen Projekt legen Sie auch die Klasse fest, die vom Client zum Server übermittelt wird. Diese Klasse wird ForwardMe genannt. Da Sie beabsichtigen, die Klasse ForwardMe über eine Referenz zu marshallen, muss die Klasse ForwardMe von dem Objekt MarshalByRefObject erben.
  1. Öffnen Sie Visual Studio .NET.
  2. Erstellen Sie eine neue Klassenbibliotheksanwendung und nennen Sie sie ServerClassRef.
  3. Benennen Sie die Datei Class1.vb in ServerClassRef.vb um.
  4. Öffnen Sie die Datei ServerClassValue.vb und fügen Sie zwei Klassen mit den Namen HelloServer und ForwardMe hinzu, die beide von MarshalByRefObject erben. Die Klasse HelloServer stellt die Hauptklasse dar, die die Clientanwendung nutzt. Verwenden Sie die Klasse ForwardMe, um Objektdaten vom Client zum Server zu senden. Ihre Codedatei ServerClassRef.vb sollte folgendermaßen aussehen:
    Public Class HelloServer
    	Inherits MarshalByRefObject
    
    End Class
    Public Class ForwardMe
    	Inherits MarshalByRefObject
    
    End Class
  5. Fügen Sie der Klasse HelloServer eine öffentliche Methode hinzu, die Sie HelloMethod nennen. Für diese öffentliche Methode verwenden Sie ein Objekt ForwardMe. Wenn Sie ein Objekt ForwardMe zum Server übermitteln wollen, verwenden Sie diese Methode. Die Methode HelloMethod ruft die Methode CallMe dieses Objekts auf. Ihre Klasse HelloServer sollte nun folgendermaßen aussehen:
    Public Class HelloServer
        Inherits MarshalByRefObject
    
        Public Sub HelloMethod(ByRef obj As ForwardMe)
            Dim i As Integer
            obj.CallMe()
        End Sub
    End Class
  6. Fügen Sie der Klasse ForwardMe eine öffentliche Methode hinzu. Geben Sie dieser Methode den Namen des Prozesses, in dem dieser Code ausgeführt wird. Der Code wird in dem Prozess des Clients ausgeführt, da Sie gerade einen Proxystub auf den Server senden und Rückrufe zum Client (Marshall über eine Referenz) tätigen.
    Public Class ForwardMe
        Inherits MarshalByRefObject
    
        Public Function CallMe() As Object
            Console.WriteLine("CallMe was executed in: " & _
            Process.GetCurrentProcess.ProcessName.ToString)
        End Function
    
    End Class
  7. Erstellen Sie das Projekt, um die Assembly ServerClassRef.dll zu erstellen.
  8. Speichern und schließen Sie das Projekt.

Wie Sie eine Remoteserver-Anwendung erstellen

Da Sie nun das Serverobjekt erstellt haben, mit dem Ihr Client in Verbindung stehen wird, müssen Sie dieses Objekt beim Remote Framework registrieren. Registrieren beinhaltet nicht nur das Registrieren des Objekts, sondern auch, dass der Server gestartet wird und dass er einen Port überwacht, über den Clients mit ihm in Verbindung treten können. Für diesen Vorgang benötigen Sie einen Projekttyp, der eine ausführbare Datei anzeigen kann. Das Serverobjekt wurde deshalb in einem separaten Projekt erstellt, um das Serverobjekt vom Client aus leichter referenzieren zu können. Wenn Sie es im gleichen Projekt aufnehmen würden, könnten Sie es nicht referenzieren, da Referenzierungen nur für DLL-Dateien eingerichtet werden können.
  1. Öffnen Sie Visual Studio .NET.
  2. Erstellen Sie einfachheitshalber eine neue Konsolenanwendung, um den Remoteserver zu starten, und nennen Sie diese ServerObjectRef.
  3. Benennen Sie die standardmäßig erstellte Datei Module1.vb in ServerObjectRef.vb um.
  4. Fügen Sie dem Projekt eine Referenz zu dem Namespace System.Runtime.Remoting hinzu.
  5. Fügen Sie der Assembly ServerClassRef.dll, die Sie im vorherigen Abschnitt erstellt haben, eine Referenz hinzu.
  6. Wenden Sie die Importerklärung auf die Namespaces Remoting, Remoting.Channels und Remoting.Channels.TCP an, damit Sie später in Ihrem Code keine Deklarationen in diesen Namespaces bestimmen müssen. Die Importerklärung muss vor allen anderen Deklarationen verwendet werden:
    Imports System.Runtime.Remoting
    Imports System.Runtime.Remoting.Channels
    Imports System.Runtime.Remoting.Channels.TCP
  7. Deklarieren Sie eine Variable, um ein Objekt TcpChannel zu initialisieren, das auf die Verbindung von Clients mit einem bestimmten Port, in diesem Fall Port 8085, reagiert. Registrieren Sie in den Channel-Diensten den Kanal, den der Client zum Kommunizieren verwenden soll, mithilfe der Methode RegisterChannel. Fügen Sie den Deklarationscode in die Main-Prozedur in Module1 hinzu:
    Dim chan As TcpChannel = New TcpChannel(8085)
    ChannelServices.RegisterChannel(chan)
  8. Registrieren Sie das Objekt ServerClassRef beim Remote Framework, indem Sie die Methode RegisterWellKnownType des Objekts RemotingConfiguration aufrufen. Geben Sie hierbei Folgendes an:
    1. Geben Sie den vollständigen Typnamen des Objekts, das registriert wird (in diesem Fall ServerClassRef.HelloServer), an. Darauf folgt der Assemblyname ServerClassRef. Sie müssen sowohl den Namen des Namespace als auch den Klassennamen angeben. Der Standard-Stamm-Namespace wird verwendet, da Sie in dem vorigen Abschnitt keinen Namespace angegeben haben.
    2. Geben Sie als Nächstes den Namen des Endpunkts an, an dem das Objekt veröffentlicht wird. Die Clients müssen diesen Namen kennen, damit sie eine Verbindung zu diesem Objekt herstellen können. Verwenden Sie RemoteTestRef.
    3. Der letzte Parameter gibt den Modus des Objekts an, der entweder SingleCall oder Singleton sein kann. In diesem Beispiel wird SingleCall verwendet. Der Objektmodus gibt die Laufzeit des Objekts an, wenn es auf dem Server aktiviert wird. Wenn es sich um Objekte mit dem Modus SingleCall handelt, wird für jeden Aufruf, der von einem Client aus getätigt wird, eine neue Instanz der Klasse erstellt, selbst wenn derselbe Client die gleiche Methode mehrmals aufruft. Objekte im Modus Singleton werden hingegen nur einmal erstellt, und alle Clients kommunizieren mit demselben Objekt:
      RemotingConfiguration.RegisterWellKnownServiceType( _
       Type.GetType("ServerClassRef.HelloServer, ServerClassRef"), _
       "RemoteTestRef", _
       WellKnownObjectMode.SingleCall)
  9. Führen Sie die Serveranwendung mithilfe der Methode ReadLine des Objekts Console weiter aus:
    Console.WriteLine("Hit <enter> to exit...")
    Console.ReadLine()
  10. Erstellen Sie Ihr Projekt.
  11. Speichern und schließen Sie das Projekt.

Wie Sie einen Client für einen Remoteserver erstellen, indem Sie Objekte übermitteln

  1. Öffnen Sie Visual Studio .NET.
  2. Erstellen Sie eine neue Konsolenanwendung mit dem Namen ClientAppRef.
  3. Benennen Sie die standardmäßig erstellte Datei Module1.vb in ClientAppRef.vb um.
  4. Fügen Sie dem Projekt eine Referenz zu dem Namespace System.Runtime.Remoting hinzu.
  5. Fügen Sie der Assembly ServerClassRef.dll, die Sie zuvor in diesem Dokument erstellt haben, eine Referenz hinzu.
  6. Wenden Sie die Importerklärung auf die Namespaces Remoting, Remoting.Channels und Remoting.Channels.TCP an, damit Sie später in Ihrem Code keine Deklarationen in diesen Namespaces bestimmen müssen. Die Importerklärung muss vor allen anderen Deklarationen verwendet werden:
    Imports System.Runtime.Remoting
    Imports System.Runtime.Remoting.Channels
    Imports System.Runtime.Remoting.Channels.TCP
  7. Deklarieren Sie eine Variable, um ein Objekt TcpChannel zu initialisieren, das der Client anwendet, um eine Verbindung zur Serveranwendung herzustellen. Wenn Sie das Objekt TcpChannel initialisieren, müssen Sie den Port angeben, um bidirektionale Kommunikation zu ermöglichen. Dies ist notwendig, da Sie ein Objekt über eine Referenz marshallen und der Server Rückrufe zum Client tätigen muss. Der Server wird hierbei diesen Port verwenden. Dabei sollte dieser Port ein anderer sein als der Port, der für das Senden der Daten verwendet wird. Registrieren Sie den Kanal in den Channel-Diensten mithilfe der Methode RegisterChannel. Als Nächstes müssen Sie ein neues Objekt ForwardMe, das zum Remoteserver übermittelt wird, initialisieren. Fügen Sie den Deklarationscode in die Main-Prozedur in Module1 hinzu:
    Dim chan As TcpChannel = New TcpChannel(8086)
    ChannelServices.RegisterChannel(chan)
    Dim objForwardMe As New ServerClassRef.ForwardMe()
  8. Nun können Sie den Remoteserver deklarieren und instanziieren. In diesem Fall instanziieren Sie das Objekt HelloServer mithilfe der Methode GetObject des Objekts Activator. Geben Sie hierbei Folgendes an:
    1. Geben Sie den vollständigen Typnamen des Objekts, das registriert wird (in diesem Fall ServerClassRef.HelloServer) an. Darauf folgt der Assemblyname ServerClassRef. Sie müssen hier sowohl den Namen des Namespace als auch den Klassennamen angeben. Der Standard-Stamm-Namespace wird verwendet, da Sie in dem vorigen Abschnitt keinen Namespace angegeben haben.
    2. Geben Sie den URI (Uniform Resource Identifier) des Objekts, das Sie aktivieren müssen, an. Der URI muss das Protokoll (tcp), den Computernamen (localhost), den Port (8085) und den Endpunkt des Serverobjekts (RemoteTestRef) beinhalten. Verwenden Sie den URI "tcp://localhost:8085/RemoteTestRef", um auf den ServerClass-Remoteserver zuzugreifen.
      Dim objHelloServer As ServerClassRef.HelloServer
      
      objHelloServer = CType(Activator.GetObject( _
          Type.GetType("ServerClassRef.HelloServer, ServerClassRef"), _
          "tcp://localhost:8085/RemoteTestRef"), _
          ServerClassRef.HelloServer)
      If objHelloServer Is Nothing Then
          Console.WriteLine("Could not locate server")
      Else
          'See next step
      End If
  9. Wenn Sie das Serverobjekt erfolgreich instanziiert haben, können Sie die Methode des Objektservers aufrufen und das neu erstellte Objekt objForwardMe übermitteln. Die veränderte Zeichenfolge sollte folglich zurück gegeben werden, also können Sie Folgendes anzeigen:
    Dim objHelloServer As ServerClassRef.HelloServer
    
    objHelloServer = CType(Activator.GetObject( _
    	Type.GetType("ServerClassRef.HelloServer, ServerClassRef"), _
    	"tcp://localhost:8085/RemoteTestRef"), _
    	ServerClassRef.HelloServer)
    If objHelloServer Is Nothing Then
    	Console.WriteLine("Could not locate server")
    Else
    	objHelloServer.HelloMethod(objForwardMe)
    End If
  10. Führen Sie die Clientanwendung mithilfe der Methode ReadLine des Objekts Console weiter aus:
    Console.WriteLine("Hit <enter> to exit...")
    Console.ReadLine()
  11. Erstellen Sie Ihr Projekt.
  12. Stellen Sie sicher, dass die Serveranwendung ausgeführt wird.
  13. Führen Sie Ihr Projekt aus und prüfen Sie die Kommunikation zwischen Client und Server. Im Konsolenfenster des Clients sollte die Ausgabe angezeigt werden. Da Sie über eine Referenz marshallen, erfolgen Rückrufe zum Client.

Informationsquellen

.NET Remoting Overview (.NET Framework Developer's Guide)

TcpChannel Class (.NET Framework Class Library)

.NET Framework Samples - Remoting
http://msdn.microsoft.com/library/techart/remoting.htm
Microsoft .NET Remoting: A Technical Overview (Beta 1 .NET Development [General] Technical Articles):
http://msdn.microsoft.com/library/techart/hawkremoting.htm
Activator.GetObject Method (.NET Framework Class Library)

Type.GetType Method (.NET Framework Class Library)

RegisterWellKnownServiceType Method (.NET Framework Class Library)



Bitte beachten Sie: Bei diesem Artikel handelt es sich um eine Übersetzung aus dem Englischen. Es ist möglich, dass nachträgliche Änderungen bzw. Ergänzungen im englischen Originalartikel in dieser Übersetzung nicht berücksichtigt sind. Die in diesem Artikel enthaltenen Informationen basieren auf der/den englischsprachigen Produktversion(en). Die Richtigkeit dieser Informationen in Zusammenhang mit anderssprachigen Produktversionen wurde im Rahmen dieser Übersetzung nicht getestet. Microsoft stellt diese Informationen ohne Gewähr für Richtigkeit bzw. Funktionalität zur Verfügung und übernimmt auch keine Gewährleistung bezüglich der Vollständigkeit oder Richtigkeit der Übersetzung.

Eigenschaften

Artikel-ID: 301112 - Geändert am: Montag, 24. Februar 2014 - Version: 1.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Visual Basic .NET 2002 Standard Edition
Keywords: 
kbnosurvey kbarchive kbhowto kbhowtomaster KB301112
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com