MarshalByRefObject MarshalByRefObject MarshalByRefObject MarshalByRefObject Class

Definición

Habilita el acceso a objetos entre los límites de dominio de aplicación en aplicaciones que admiten el acceso remoto.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
Herencia
MarshalByRefObjectMarshalByRefObjectMarshalByRefObjectMarshalByRefObject
Derivado
Atributos

Ejemplos

Esta sección contiene dos ejemplos de código.This section contains two code examples. El primer ejemplo de código muestra cómo crear una instancia de una clase en otro dominio de aplicación.The first code example shows how to create an instance of a class in another application domain. El segundo ejemplo de código muestra una clase sencilla que se puede usar para la comunicación remota.The second code example shows a simple class that can be used for remoting.

Ejemplo 1Example 1

El ejemplo de código siguiente muestra la manera más sencilla para ejecutar código en otro dominio de aplicación.The following code example shows the simplest way to execute code in another application domain. El ejemplo define una clase denominada Worker que herede MarshalByRefObject, con un método que muestra el nombre del dominio de aplicación en el que se está ejecutando.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. El ejemplo crea instancias de Worker en el dominio de aplicación predeterminado y en un dominio de aplicación.The example creates instances of Worker in the default application domain and in a new application domain.

Nota

El ensamblado que contiene Worker deben cargarse en ambos dominios de aplicación, pero se podrían cargar otros ensamblados que existirán solo en el nuevo dominio de aplicación.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"

Ejemplo 2Example 2

En el ejemplo siguiente se muestra una clase derivada de MarshalByRefObject es decir, usa más adelante en 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

Comentarios

Un dominio de aplicación es una partición en un proceso de sistema operativo donde residen una o varias aplicaciones.An application domain is a partition in an operating system process where one or more applications reside. Los objetos en el mismo dominio de aplicación se comunican directamente.Objects in the same application domain communicate directly. Objetos en distintos dominios de aplicación se comunican mediante el transporte de copias de los objetos entre límites de dominio de aplicación, o mediante el uso de un proxy para intercambiar mensajes.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 la clase base para los objetos que se comunican a través de los límites del dominio de aplicación mediante el intercambio de mensajes usa un proxy.MarshalByRefObject is the base class for objects that communicate across application domain boundaries by exchanging messages using a proxy. Los objetos que no heredan de MarshalByRefObject son implícitamente calcular las referencias por valor.Objects that do not inherit from MarshalByRefObject are implicitly marshal by value. Cuando una aplicación remota hace referencia a un cálculo de referencias al objeto de valor, una copia del objeto se pasa a través de los límites del dominio de aplicación.When a remote application references a marshal by value object, a copy of the object is passed across application domain boundaries.

MarshalByRefObject se tiene acceso a objetos directamente dentro de los límites del dominio de aplicación local.MarshalByRefObject objects are accessed directly within the boundaries of the local application domain. Dominio de aplicación de la primera vez que una aplicación en un control remoto tiene acceso a un MarshalByRefObject, se pasa un proxy a la aplicación remota.The first time an application in a remote application domain accesses a MarshalByRefObject, a proxy is passed to the remote application. Las llamadas subsiguientes en el servidor proxy se calculan las referencias al objeto que se encuentran en el dominio de aplicación local.Subsequent calls on the proxy are marshaled back to the object residing in the local application domain.

Tipos deben heredar de MarshalByRefObject cuando se utiliza el tipo en los límites del dominio de aplicación, y no se debe copiar el estado del objeto porque los miembros del objeto no se puede usar fuera del dominio de aplicación donde se crearon.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.

Al derivar un objeto de MarshalByRefObject para su uso en los límites del dominio de aplicación, no se debe reemplazar cualquiera de sus miembros, ni debe llamar a sus métodos directamente.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. El tiempo de ejecución reconoce que las clases derivadas de MarshalByRefObject deben calcularse a través de los límites del dominio de aplicación.The runtime recognizes that classes derived from MarshalByRefObject should be marshaled across app domain boundaries.

Constructores

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

Inicializa una nueva instancia de la clase MarshalByRefObject.Initializes a new instance of the MarshalByRefObject class.

Métodos

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

Crea un objeto que contiene toda la información relevante necesaria para generar un proxy utilizado para comunicarse con un objeto remoto.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)

Determina si el objeto especificado es igual al objeto actual.Determines whether the specified object is equal to the current object.

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

Sirve como la función hash predeterminada.Serves as the default hash function.

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

Recupera el objeto de servicio de duración actual que controla la directiva de duración de esta instancia.Retrieves the current lifetime service object that controls the lifetime policy for this instance.

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

Obtiene el Type de la instancia actual.Gets the Type of the current instance.

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

Obtiene un objeto de servicio de duración para controlar la directiva de duración de esta instancia.Obtains a lifetime service object to control the lifetime policy for this instance.

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

Crea una copia superficial del Object actual.Creates a shallow copy of the current Object.

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

Crea una copia superficial del objeto MarshalByRefObject actual.Creates a shallow copy of the current MarshalByRefObject object.

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

Devuelve una cadena que representa el objeto actual.Returns a string that represents the current object.

(Inherited from Object)

Se aplica a