MarshalByRefObject MarshalByRefObject MarshalByRefObject MarshalByRefObject Class

Definition

Ermöglicht den Zugriff auf Objekte über Anwendungsdomänen hinweg in Anwendungen, die Remoting unterstützen.Enables access to objects across application domain boundaries in applications that support remoting.

public ref class MarshalByRefObject abstract
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public abstract class MarshalByRefObject
type MarshalByRefObject = class
Public MustInherit Class MarshalByRefObject
Vererbung
MarshalByRefObjectMarshalByRefObjectMarshalByRefObjectMarshalByRefObject
Abgeleitet
Attribute

Beispiele

Dieser Abschnitt enthält zwei Codebeispiele.This section contains two code examples. Im ersten Codebeispiel wird veranschaulicht, die eine Instanz einer Klasse in einer anderen Anwendungsdomäne zu erstellen.The first code example shows how to create an instance of a class in another application domain. Das zweite Codebeispiel zeigt eine einfache Klasse, die für das Remoting verwendet werden kann.The second code example shows a simple class that can be used for remoting.

Beispiel 1Example 1

Das folgende Codebeispiel zeigt die einfachste Möglichkeit zum Ausführen von Code in einer anderen Anwendungsdomäne.The following code example shows the simplest way to execute code in another application domain. Das Beispiel definiert eine Klasse namens Worker erbt MarshalByRefObject, mit einer Methode, die den Namen der Anwendungsdomäne anzeigt, in der er ausgeführt wird.The example defines a class named Worker that inherits MarshalByRefObject, with a method that displays the name of the application domain in which it is executing. Das Beispiel erstellt Instanzen von Worker in der Standardanwendungsdomäne und in eine neue Anwendungsdomäne.The example creates instances of Worker in the default application domain and in a new application domain.

Hinweis

Die Assembly mit Worker muss in beide Anwendungsdomänen geladen werden, aber es kann andere Assemblys laden, die nur in der neuen Anwendungsdomäne vorhanden wäre.The assembly that contains Worker must be loaded into both application domains, but it could load other assemblies that would exist only in the new application domain.

using namespace System;
using namespace System::Reflection;

public ref class Worker : MarshalByRefObject
{
public:
    void PrintDomain() 
    { 
        Console::WriteLine("Object is executing in AppDomain \"{0}\"",
            AppDomain::CurrentDomain->FriendlyName); 
    }
};
 
void main()
{
    // Create an ordinary instance in the current AppDomain
    Worker^ localWorker = gcnew Worker();
    localWorker->PrintDomain();
 
    // Create a new application domain, create an instance
    // of Worker in the application domain, and execute code
    // there.
    AppDomain^ ad = AppDomain::CreateDomain("New domain");
    Worker^ remoteWorker = (Worker^) ad->CreateInstanceAndUnwrap(
        Worker::typeid->Assembly->FullName,
        "Worker");
    remoteWorker->PrintDomain();
}

/* This code produces output similar to the following:

Object is executing in AppDomain "source.exe"
Object is executing in AppDomain "New domain"
 */
using System;
using System.Reflection;
 
public class Worker : MarshalByRefObject
{
    public void PrintDomain() 
    { 
        Console.WriteLine("Object is executing in AppDomain \"{0}\"",
            AppDomain.CurrentDomain.FriendlyName); 
    }
}
 
class Example
{
    public static void Main()
    {
        // Create an ordinary instance in the current AppDomain
        Worker localWorker = new Worker();
        localWorker.PrintDomain();
 
        // Create a new application domain, create an instance
        // of Worker in the application domain, and execute code
        // there.
        AppDomain ad = AppDomain.CreateDomain("New domain");
        Worker remoteWorker = (Worker) ad.CreateInstanceAndUnwrap(
            typeof(Worker).Assembly.FullName,
            "Worker");
        remoteWorker.PrintDomain();
    }
}

/* This code produces output similar to the following:

Object is executing in AppDomain "source.exe"
Object is executing in AppDomain "New domain"
 */
Imports System.Reflection

Public Class Worker
    Inherits MarshalByRefObject
    
    Public Sub PrintDomain() 
        Console.WriteLine("Object is executing in AppDomain ""{0}""", _
            AppDomain.CurrentDomain.FriendlyName)
    End Sub 
End Class 

Class Example
    
    Public Shared Sub Main() 
        ' Create an ordinary instance in the current AppDomain
        Dim localWorker As New Worker()
        localWorker.PrintDomain()
        
        ' Create a new application domain, create an instance
        ' of Worker in the application domain, and execute code
        ' there.
        Dim ad As AppDomain = AppDomain.CreateDomain("New domain")
        Dim remoteWorker As Worker = CType( _
            ad.CreateInstanceAndUnwrap( _
                GetType(Worker).Assembly.FullName, _
                "Worker"), _
            Worker)
        remoteWorker.PrintDomain()
    
    End Sub 
End Class 

' This code produces output similar to the following:
'
'Object is executing in AppDomain "source.exe"
'Object is executing in AppDomain "New domain"

Beispiel 2Example 2

Das folgende Beispiel zeigt eine Klasse, die von abgeleiteten MarshalByRefObject , verwendet Sie weiter unten in Remoting.The following example demonstrates a class derived from MarshalByRefObject that is used later in remoting.

using namespace System;
using namespace System::Runtime::Remoting;
using namespace System::Security::Permissions;

public ref class SetObjectUriForMarshalTest
{
public:
   ref class TestClass: public MarshalByRefObject{};

   [SecurityPermissionAttribute(SecurityAction::Demand, Flags=SecurityPermissionFlag::RemotingConfiguration)]   
   static void Main()
   {
      TestClass^ obj = gcnew TestClass;
      RemotingServices::SetObjectUriForMarshal( obj,  "testUri" );
      RemotingServices::Marshal(obj);
      Console::WriteLine( RemotingServices::GetObjectUri( obj ) );
   }

};
using System;
using System.Runtime.Remoting;
using System.Security.Permissions;

public class SetObjectUriForMarshalTest  {

    class TestClass : MarshalByRefObject {
    }

    [SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)] 
    public static void Main()  {

        TestClass obj = new TestClass();    

        RemotingServices.SetObjectUriForMarshal(obj, "testUri");
        RemotingServices.Marshal(obj);

        Console.WriteLine(RemotingServices.GetObjectUri(obj));
    }
}
Imports System.Runtime.Remoting
Imports System.Security.Permissions


Public Class SetObjectUriForMarshalTest
    
    Class TestClass
        Inherits MarshalByRefObject
    End Class

    <SecurityPermission(SecurityAction.Demand, Flags:= SecurityPermissionFlag.RemotingConfiguration )> _
    Public Shared Sub Main()
        Dim obj As TestClass = New TestClass()

        RemotingServices.SetObjectUriForMarshal(obj, "testUri")
        RemotingServices.Marshal(obj)

        Console.WriteLine(RemotingServices.GetObjectUri(obj))
    End Sub

End Class

Hinweise

Eine Anwendungsdomäne wird eine Partition in einem Betriebssystem-Prozess, in dem eine oder mehrere Anwendungen gespeichert.An application domain is a partition in an operating system process where one or more applications reside. Objekte in der gleichen Anwendungsdomäne kommunizieren direkt.Objects in the same application domain communicate directly. Objekte in anderen Anwendungsdomänen kommunizieren Transportieren von Kopien von Objekten über Anwendungsdomänen hinweg, oder mit einem Proxy zum Austausch von Nachrichten.Objects in different application domains communicate either by transporting copies of objects across application domain boundaries, or by using a proxy to exchange messages.

MarshalByRefObject die Basisklasse für Objekte, die Austausch von Nachrichten über Anwendungsdomänengrenzen hinweg kommunizieren, die einen Proxy verwenden.MarshalByRefObject is the base class for objects that communicate across application domain boundaries by exchanging messages using a proxy. Objekte, die nicht von erben MarshalByRefObject werden implizit als Wert gemarshallt werden soll.Objects that do not inherit from MarshalByRefObject are implicitly marshal by value. Wenn eine Remoteanwendung eine Marshallen von Wertobjekt verweist, wird eine Kopie des Objekts über Anwendungsdomänengrenzen hinweg übergeben.When a remote application references a marshal by value object, a copy of the object is passed across application domain boundaries.

MarshalByRefObject Objekte werden direkt innerhalb der Grenzen der Anwendungsdomäne, lokalen zugegriffen.MarshalByRefObject objects are accessed directly within the boundaries of the local application domain. Zum ersten Mal eine Anwendung in einer Anwendungsdomäne greift ein MarshalByRefObject, ein Proxy an die Anwendung übergeben wird.The first time an application in a remote application domain accesses a MarshalByRefObject, a proxy is passed to the remote application. Nachfolgende Aufrufe für den Proxy werden zurück an das Objekt, das sich befinden, in der lokalen Anwendungsdomäne gemarshallt.Subsequent calls on the proxy are marshaled back to the object residing in the local application domain.

Typen erben müssen MarshalByRefObject Wenn der Typ über Anwendungsdomänengrenzen hinweg verwendet wird, und der Zustand des Objekts muss nicht kopiert werden, da die Member des Objekts nicht außerhalb der Anwendungsdomäne verwendet werden können, in dem sie erstellt wurden.Types must inherit from MarshalByRefObject when the type is used across application domain boundaries, and the state of the object must not be copied because the members of the object are not usable outside the application domain where they were created.

Beim Ableiten eines Objekts aus MarshalByRefObject für die Verwendung über Anwendungsdomänengrenzen hinweg, Sie sollten nicht überschreiben eines ihrer Elemente, und sollten Sie seine Methoden direkt aufrufen.When you derive an object from MarshalByRefObject for use across application domain boundaries, you should not override any of its members, nor should you call its methods directly. Die Runtime erkennt, dass Klassen abgeleitete MarshalByRefObject über app-Domänengrenzen hinweg gemarshallt werden sollen.The runtime recognizes that classes derived from MarshalByRefObject should be marshaled across app domain boundaries.

Konstruktoren

MarshalByRefObject() MarshalByRefObject() MarshalByRefObject() MarshalByRefObject()

Initialisiert eine neue Instanz der MarshalByRefObject-Klasse.Initializes a new instance of the MarshalByRefObject class.

Methoden

CreateObjRef(Type) CreateObjRef(Type) CreateObjRef(Type) CreateObjRef(Type)

Erstellt ein Objekt mit allen relevanten Informationen, die zum Generieren eines Proxys für die Kommunikation mit einem Remoteobjekt erforderlich sind.Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Bestimmt, ob das angegebene Objekt mit dem aktuellen Objekt identisch ist.Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Fungiert als die Standardhashfunktion.Serves as the default hash function.

(Inherited from Object)
GetLifetimeService() GetLifetimeService() GetLifetimeService() GetLifetimeService()

Ruft das aktuelle Lebensdauerdienstobjekt ab, das die Lebensdauerrichtlinien für diese Instanz steuert.Retrieves the current lifetime service object that controls the lifetime policy for this instance.

GetType() GetType() GetType() GetType()

Ruft den Type der aktuellen Instanz ab.Gets the Type of the current instance.

(Inherited from Object)
InitializeLifetimeService() InitializeLifetimeService() InitializeLifetimeService() InitializeLifetimeService()

Ruft ein Lebensdauerdienstobjekt zur Steuerung der Lebensdauerrichtlinie für diese Instanz ab.Obtains a lifetime service object to control the lifetime policy for this instance.

MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.Creates a shallow copy of the current Object.

(Inherited from Object)
MemberwiseClone(Boolean) MemberwiseClone(Boolean) MemberwiseClone(Boolean) MemberwiseClone(Boolean)

Erstellt eine flache Kopie des aktuellen MarshalByRefObject-Objekts.Creates a shallow copy of the current MarshalByRefObject object.

ToString() ToString() ToString() ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.Returns a string that represents the current object.

(Inherited from Object)

Gilt für: