MarshalByRefObject Klasa

Definicja

Umożliwia dostęp do obiektów między granicami domeny aplikacji w aplikacjach, które obsługują komunikację zdalną.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
Dziedziczenie
MarshalByRefObject
Pochodne
Atrybuty

Przykłady

Ten rozdział zawiera dwa przykłady kodu.This section contains two code examples. Pierwszy przykład kodu pokazuje, jak utworzyć wystąpienie klasy w innej domenie aplikacji.The first code example shows how to create an instance of a class in another application domain. Drugi przykład kodu przedstawia prostą klasę, która może być używana do komunikacji zdalnej.The second code example shows a simple class that can be used for remoting.

Przykład 1Example 1

Poniższy przykład kodu pokazuje najprostszy sposób wykonywania kodu w innej domenie aplikacji.The following code example shows the simplest way to execute code in another application domain. W przykładzie zdefiniowano klasę o Worker nazwie, MarshalByRefObjectktóra dziedziczy, przy użyciu metody, która wyświetla nazwę domeny aplikacji, w której jest wykonywane.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. Przykład tworzy wystąpienia Worker w domyślnej domenie aplikacji i w nowej domenie aplikacji.The example creates instances of Worker in the default application domain and in a new application domain.

Uwaga

Zestaw, który zawiera Worker musi być załadowany do obu domen aplikacji, ale może ładować inne zestawy, które mogą istnieć tylko w nowej domenie aplikacji.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"

Przykład 2Example 2

Poniższy przykład ilustruje klasę pochodną MarshalByRefObject , która jest używana później w komunikacji zdalnej.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

Uwagi

Domena aplikacji to partycja w procesie systemu operacyjnego, w której znajdują się co najmniej jedna aplikacja.An application domain is a partition in an operating system process where one or more applications reside. Obiekty w tej samej domenie aplikacji komunikują się bezpośrednio.Objects in the same application domain communicate directly. Obiekty w różnych domenach aplikacji komunikują się przez transportowanie kopii obiektów między granicami domeny aplikacji lub przy użyciu serwera proxy do wymiany komunikatów.Objects in different application domains communicate either by transporting copies of objects across application domain boundaries, or by using a proxy to exchange messages.

MarshalByRefObjectjest klasą bazową dla obiektów, które komunikują się w granicach domen aplikacji przez wymianę komunikatów przy użyciu serwera proxy.MarshalByRefObject is the base class for objects that communicate across application domain boundaries by exchanging messages using a proxy. Obiekty, które nie dziedziczą MarshalByRefObject , są niejawnie organizowane przez wartość.Objects that do not inherit from MarshalByRefObject are implicitly marshal by value. Gdy aplikacja zdalna odwołuje się do obiektu Marshal przez wartość, kopia obiektu jest przesyłana między granicami domeny aplikacji.When a remote application references a marshal by value object, a copy of the object is passed across application domain boundaries.

MarshalByRefObjectdostęp do obiektów odbywa się bezpośrednio w granicach lokalnej domeny aplikacji.MarshalByRefObject objects are accessed directly within the boundaries of the local application domain. Przy pierwszym uruchomieniu aplikacji w domenie MarshalByRefObjectaplikacji zdalnej serwer proxy jest przesyłany do aplikacji zdalnej.The first time an application in a remote application domain accesses a MarshalByRefObject, a proxy is passed to the remote application. Kolejne wywołania na serwerze proxy są przekazywane z powrotem do obiektu znajdującego się w lokalnej domenie aplikacji.Subsequent calls on the proxy are marshaled back to the object residing in the local application domain.

Typy muszą dziedziczyć MarshalByRefObject po, gdy typ jest używany między granicami domeny aplikacji, a stan obiektu nie może być kopiowany, ponieważ elementy członkowskie obiektu nie są użyteczne poza domeną aplikacji, w której zostały utworzone.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.

Gdy uzyskujesz obiekt z MarshalByRefObject do użycia między granicami domeny aplikacji, nie należy przesłonić żadnego z jego składowych ani nie być bezpośrednio wywoływana metodami.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. Środowisko uruchomieniowe rozpoznaje, że klasy MarshalByRefObject pochodne z powinny być organizowane między granicami domeny aplikacji.The runtime recognizes that classes derived from MarshalByRefObject should be marshaled across app domain boundaries.

Konstruktory

MarshalByRefObject()

Inicjuje nowe wystąpienie klasy MarshalByRefObject klasy.Initializes a new instance of the MarshalByRefObject class.

Metody

CreateObjRef(Type)

Tworzy obiekt, który zawiera wszystkie istotne informacje wymagane do wygenerowania serwera proxy używanego do komunikacji z obiektem zdalnym.Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object.

Equals(Object)

Określa, czy określony obiekt jest równy bieżącemu obiektowi.Determines whether the specified object is equal to the current object.

(Odziedziczone po Object)
GetHashCode()

Służy jako domyślna funkcja skrótu.Serves as the default hash function.

(Odziedziczone po Object)
GetLifetimeService()

Pobiera bieżący obiekt usługi okresu istnienia, który kontroluje zasady okresu istnienia dla tego wystąpienia.Retrieves the current lifetime service object that controls the lifetime policy for this instance.

GetType()

Pobiera Type bieżącego wystąpienia.Gets the Type of the current instance.

(Odziedziczone po Object)
InitializeLifetimeService()

Uzyskuje obiekt usługi istnienia w celu kontrolowania zasad okresu istnienia dla tego wystąpienia.Obtains a lifetime service object to control the lifetime policy for this instance.

MemberwiseClone()

Tworzy skróconą kopię bieżącego Object.Creates a shallow copy of the current Object.

(Odziedziczone po Object)
MemberwiseClone(Boolean)

Tworzy skróconą kopię bieżącego MarshalByRefObject obiektu.Creates a shallow copy of the current MarshalByRefObject object.

ToString()

Zwraca ciąg, który reprezentuje bieżący obiekt.Returns a string that represents the current object.

(Odziedziczone po Object)

Dotyczy