MarshalByRefObject MarshalByRefObject MarshalByRefObject MarshalByRefObject Class

Definice

Umožňuje přístup k objektům napříč hranicemi aplikační domény v aplikacích, které podporují vzdálenou komunikaci.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
Dědičnost
MarshalByRefObjectMarshalByRefObjectMarshalByRefObjectMarshalByRefObject
Odvozené
Atributy

Příklady

Tato část obsahuje dva příklady kódu.This section contains two code examples. První příklad kódu ukazuje, jak vytvořit instanci třídy v jiné doméně aplikace.The first code example shows how to create an instance of a class in another application domain. Druhý příklad kódu ukazuje jednoduchou třídu, která se dá použít pro vzdálenou komunikaci.The second code example shows a simple class that can be used for remoting.

Příklad 1Example 1

Následující příklad kódu ukazuje nejjednodušší způsob, jak spustit kód v jiné doméně aplikace.The following code example shows the simplest way to execute code in another application domain. Příklad definuje třídu s názvem Worker , která dědí MarshalByRefObject, s metodou, která zobrazuje název domény aplikace, ve které je spuštěna.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. Příklad vytvoří instance Worker ve výchozí aplikační doméně a v nové doméně aplikace.The example creates instances of Worker in the default application domain and in a new application domain.

Poznámka

Sestavení, které obsahuje Worker , musí být načteno do obou domén aplikace, ale může načíst další sestavení, která by existovala pouze v nové doméně aplikace.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"

Příklad 2Example 2

Následující příklad ukazuje třídu odvozenou z MarshalByRefObject , která je používána později při vzdálené komunikaci.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

Poznámky

Doména aplikace je oddíl v procesu operačního systému, ve kterém se nachází jedna nebo více aplikací.An application domain is a partition in an operating system process where one or more applications reside. Objekty ve stejné doméně aplikace komunikují přímo.Objects in the same application domain communicate directly. Objekty v různých aplikačních doménách komunikují buď pomocí přenosu kopií objektů napříč hranicemi domény aplikace, nebo pomocí proxy serveru pro výměnu zpráv.Objects in different application domains communicate either by transporting copies of objects across application domain boundaries, or by using a proxy to exchange messages.

MarshalByRefObjectje základní třídou pro objekty, které komunikují přes hranice aplikační domény, výměnou zpráv pomocí proxy serveru.MarshalByRefObject is the base class for objects that communicate across application domain boundaries by exchanging messages using a proxy. Objekty, které nejsou děděny MarshalByRefObject , jsou implicitně zařazeny podle hodnoty.Objects that do not inherit from MarshalByRefObject are implicitly marshal by value. Když Vzdálená aplikace odkazuje na zařazení podle objektu hodnoty, kopie objektu se předává napříč hranicemi aplikační domény.When a remote application references a marshal by value object, a copy of the object is passed across application domain boundaries.

MarshalByRefObjectobjekty jsou dostupné přímo v rámci hranic místní domény aplikace.MarshalByRefObject objects are accessed directly within the boundaries of the local application domain. Když aplikace ve vzdálené doméně aplikace přistupuje MarshalByRefObjectk serveru, je proxy serveru předán do vzdálené aplikace.The first time an application in a remote application domain accesses a MarshalByRefObject, a proxy is passed to the remote application. Následná volání na proxy serveru jsou zařazena zpět do objektu umístěného v místní doméně aplikace.Subsequent calls on the proxy are marshaled back to the object residing in the local application domain.

Typy musí dědit z MarshalByRefObject , pokud je typ použit napříč hranicemi aplikační domény a stav objektu nesmí být zkopírován, protože členy objektu nelze použít mimo doménu aplikace, ve které byly vytvořeny.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.

Pokud odvozujete objekt z MarshalByRefObject pro použití v rámci hranice aplikační domény, neměli byste přepsat žádné z jeho členů, ani byste neměli volat metody přímo.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. Modul runtime rozpozná, že třídy odvozené MarshalByRefObject od by měly být zařazeny mezi hranice domény aplikace.The runtime recognizes that classes derived from MarshalByRefObject should be marshaled across app domain boundaries.

Konstruktory

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

Inicializuje novou instanci třídy MarshalByRefObject třídy.Initializes a new instance of the MarshalByRefObject class.

Metody

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

Vytvoří objekt, který obsahuje všechny relevantní informace požadované pro vygenerování proxy serveru, který se používá ke komunikaci se vzdáleným objektem.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)

Určuje, zda se zadaný objekt rovná aktuálnímu objektu.Determines whether the specified object is equal to the current object.

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

Slouží jako výchozí funkce hash.Serves as the default hash function.

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

Načte aktuální objekt služby životnosti, který řídí zásady životního cyklu pro tuto instanci.Retrieves the current lifetime service object that controls the lifetime policy for this instance.

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

Získá Type aktuální instance.Gets the Type of the current instance.

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

Získá objekt služby životnosti, který řídí zásady životního cyklu pro tuto instanci.Obtains a lifetime service object to control the lifetime policy for this instance.

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

Vytvoří Mělkou kopii aktuální Object.Creates a shallow copy of the current Object.

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

Vytvoří kopii aktuálního MarshalByRefObject objektu bez podstruktury.Creates a shallow copy of the current MarshalByRefObject object.

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

Vrací řetězec, který představuje aktuální objekt.Returns a string that represents the current object.

(Inherited from Object)

Platí pro