Esta documentación está archivada y no tiene mantenimiento.

MarshalByRefObject (Clase)

Actualización: noviembre 2007

Permite obtener acceso a objetos a través de los límites de los dominios de las aplicaciones que admiten acceso remoto.

Espacio de nombres:  System
Ensamblado:  mscorlib (en mscorlib.dll)

[SerializableAttribute]
[ComVisibleAttribute(true)]
public abstract class MarshalByRefObject
/** @attribute SerializableAttribute */ 
/** @attribute ComVisibleAttribute(true) */
public abstract class MarshalByRefObject
public abstract class MarshalByRefObject

Un dominio de aplicación es una partición en el proceso de un sistema operativo en el que residen una o más aplicaciones. Los objetos que están en el mismo dominio de aplicación se comunican directamente. Los objetos de diferentes dominios de aplicación se comunican bien transportando copias de objetos a través de los límites de los dominios de aplicación o utilizando un proxy para intercambiar mensajes.

MarshalByRefObject es la clase base de los objetos que se comunican a través de los límites de los dominios de aplicación que utilizan un proxy para intercambiar mensajes. Los objetos que no heredan de MarshalByRefObject tienen implícitamente valor de resolución. Cuando una aplicación remota hace referencia a un objeto con valor de resolución, se pasa una copia del objeto a través de los límites del dominio de la aplicación.

Es posible obtener acceso a los objetos MarshalByRefObject directamente dentro de los límites del dominio local de la aplicación. La primera vez que una aplicación en un dominio de aplicación remoto obtiene acceso a un MarshalByRefObject, se pasa un proxy a la aplicación remota. El cálculo de referencias de las siguientes llamadas que se realizan en el proxy, volverá a tener lugar en el objeto que reside en el dominio de la aplicación local.

Los tipos deben heredar de MarshalByRefObject, cuando el tipo se utiliza en los límites de los dominios de las aplicaciones, y no se debe copiar el estado del objeto porque los miembros del objeto no se utilicen fuera del dominio de la aplicación en el que se crearon.

Esta sección contiene dos ejemplos de código. En el primer ejemplo de código se muestra la forma de crear una instancia de una clase en otro dominio de aplicación. En el segundo ejemplo de código se muestra una clase simple que se puede utilizar para el funcionamiento remoto.

Ejemplo 1

En el ejemplo de código siguiente se muestra la forma más sencilla de ejecutar código en otro dominio de aplicación. En el ejemplo se define una clase denominada Worker que hereda MarshalByRefObject, con un método que muestra el nombre del dominio de aplicación en el que se está ejecutando. En el ejemplo se crean instancias de Worker en el dominio de aplicación predeterminado y en un nuevo dominio de aplicación.

w4302s1f.alert_note(es-es,VS.90).gifNota:

El ensamblado que contiene Worker se debe cargar en ambos dominios de aplicación, pero se podrían cargar otros ensamblados que sólo existieran en el nuevo dominio de aplicación.

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(
            Assembly.GetExecutingAssembly().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"
 */


Ejemplo 2

En el ejemplo siguiente se muestra una clase derivada de MarshalByRefObject que se utiliza más tarde de forma remota.

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));
    }
}


System.Object
  System.MarshalByRefObject
    IEHost.Execute.IEExecuteRemote
    Microsoft.Build.Utilities.AppDomainIsolatedTask
    Microsoft.Build.Utilities.AppDomainIsolatedTask
    Microsoft.Build.Utilities.TaskItem
    Microsoft.Build.Utilities.TaskItem
    Microsoft.Build.Utilities.TaskLoggingHelper
    Microsoft.Build.Utilities.TaskLoggingHelper
    Microsoft.ManagementConsole.Internal.Request
    Microsoft.Web.Management.Server.TypeInformationGenerator
    Microsoft.Win32.RegistryKey
    System.AddIn.Pipeline.ContractBase
    System.AppDomain
    System.AppDomainManager
    System.ComponentModel.Component
    System.ContextBoundObject
    System.Data.Common.DataColumnMapping
    System.Data.Common.DataColumnMappingCollection
    System.Data.Common.DataTableMapping
    System.Data.Common.DataTableMappingCollection
    System.Data.Common.DbDataReader
    System.Data.Common.DbParameter
    System.Data.Common.DbParameterCollection
    System.Data.Common.DbTransaction
    System.Diagnostics.TraceListener
    System.DirectoryServices.SearchResultCollection
    System.Drawing.Brush
    System.Drawing.Drawing2D.CustomLineCap
    System.Drawing.Drawing2D.GraphicsContainer
    System.Drawing.Drawing2D.GraphicsPath
    System.Drawing.Drawing2D.GraphicsPathIterator
    System.Drawing.Drawing2D.GraphicsState
    System.Drawing.Drawing2D.Matrix
    System.Drawing.Font
    System.Drawing.FontFamily
    System.Drawing.Graphics
    System.Drawing.Icon
    System.Drawing.Image
    System.Drawing.Pen
    System.Drawing.Region
    System.Drawing.StringFormat
    System.EnterpriseServices.Internal.AssemblyLocator
    System.EnterpriseServices.RegistrationHelper
    System.IO.FileSystemInfo
    System.IO.IsolatedStorage.IsolatedStorage
    System.IO.Stream
    System.IO.TextReader
    System.IO.TextWriter
    System.Messaging.MessageEnumerator
    System.Messaging.MessageQueueEnumerator
    System.Net.WebRequest
    System.Net.WebResponse
    System.Reflection.AssemblyNameProxy
    System.Runtime.InteropServices.StandardOleMarshalObject
    System.Runtime.Remoting.Lifetime.ClientSponsor
    System.Runtime.Remoting.ObjectHandle
    System.Speech.Recognition.SrgsGrammar.SrgsElement
    System.Threading.RegisteredWaitHandle
    System.Threading.Timer
    System.Threading.WaitHandle
    System.Web.Compilation.ClientBuildManager
    System.Web.Compilation.ClientBuildManagerCallback
    System.Web.Hosting.ApplicationManager
    System.Web.Hosting.HostingEnvironment
    System.Web.Hosting.ISAPIRuntime
    System.Web.Hosting.VirtualFileBase
    System.Web.Hosting.VirtualPathProvider
    System.Windows.Forms.BaseCollection
    System.Windows.Forms.NativeWindow
    System.Windows.Forms.NumericUpDownAccelerationCollection
    System.Windows.Forms.OwnerDrawPropertyBag
    System.Windows.Forms.TreeNode
    System.Windows.Interop.DocObjHost
    System.Workflow.Runtime.DebugEngine.DebugController

Todos los miembros static (Shared en Visual Basic) públicos de este tipo son seguros para la ejecución de subprocesos. No se garantiza que los miembros de instancias sean seguros para la ejecución de subprocesos.

Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile para Smartphone, Windows Mobile para Pocket PC, Xbox 360

.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.

.NET Framework

Compatible con: 3.5, 3.0, 2.0, 1.1, 1.0

.NET Compact Framework

Compatible con: 3.5, 2.0, 1.0

XNA Framework

Compatible con: 2.0, 1.0
Mostrar: