Compartilhar via


MarshalByRefObject Classe

Definição

Permite acesso a objetos entre limites de domínio de aplicativo em aplicativos que dão suporte a comunicação remota.

public ref class MarshalByRefObject abstract
public abstract class MarshalByRefObject
[System.Serializable]
public abstract class MarshalByRefObject
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class MarshalByRefObject
type MarshalByRefObject = class
[<System.Serializable>]
type MarshalByRefObject = class
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type MarshalByRefObject = class
Public MustInherit Class MarshalByRefObject
Herança
MarshalByRefObject
Derivado
Atributos

Exemplos

Esta seção contém dois exemplos de código. O primeiro exemplo de código mostra como criar uma instância de uma classe em outro domínio de aplicativo. O segundo exemplo de código mostra uma classe simples que pode ser usada para a remoção.

Exemplo 1

O exemplo de código a seguir mostra a maneira mais simples de executar o código em outro domínio de aplicativo. O exemplo define uma classe chamada que herda , com um método que exibe o nome do domínio do aplicativo no qual Worker MarshalByRefObject ele está sendo executado. O exemplo cria instâncias de Worker no domínio do aplicativo padrão e em um novo domínio de aplicativo.

Observação

O assembly que contém deve ser carregado em ambos os domínios do aplicativo, mas pode carregar outros assemblies que existiriam somente Worker no novo domínio do aplicativo.

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"

Exemplo 2

O exemplo a seguir demonstra uma classe derivada de MarshalByRefObject que é usada posteriormente na 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

Comentários

Um domínio de aplicativo é uma partição em um processo do sistema operacional em que reside um ou mais aplicativos. Objetos no mesmo domínio do aplicativo se comunicam diretamente. Objetos em domínios de aplicativos diferentes se comunicam transportando cópias de objetos entre limites de domínio do aplicativo ou usando um proxy para trocar mensagens.

MarshalByRefObject é a classe base para objetos que se comunicam entre limites de domínio do aplicativo pela troca de mensagens usando um proxy. Objetos que não herdam de MarshalByRefObject são implicitamente empacotados por valor. Quando um aplicativo remoto referencia um marshal por objeto de valor, uma cópia do objeto é passada entre os limites de domínio do aplicativo.

MarshalByRefObject os objetos são acessados diretamente dentro dos limites do domínio do aplicativo local. Na primeira vez que um aplicativo em um domínio de aplicativo remoto acessa um MarshalByRefObject , um proxy é passado para o aplicativo remoto. Chamadas subsequentes no proxy têm marshaling de volta para o objeto que reside no domínio do aplicativo local.

Os tipos devem herdar de quando o tipo é usado entre limites de domínio do aplicativo e o estado do objeto não deve ser copiado porque os membros do objeto não podem ser usados fora do domínio do aplicativo em que foram MarshalByRefObject criados.

Ao derivar um objeto de para uso entre limites de domínio do aplicativo, você não deve substituir nenhum de seus membros, nem deve MarshalByRefObject chamar seus métodos diretamente. O runtime reconhece que as classes derivadas de devem ser empacotadas entre MarshalByRefObject limites de domínio do aplicativo.

Construtores

MarshalByRefObject()

Inicializa uma nova instância da classe MarshalByRefObject.

Métodos

CreateObjRef(Type)

Cria um objeto que contém todas as informações relevantes necessárias para gerar um proxy usado para se comunicar com um objeto remoto.

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
GetHashCode()

Serve como a função de hash padrão.

(Herdado de Object)
GetLifetimeService()
Obsoleto.

Recupera o objeto de serviço de tempo de vida atual que controla a política de ciclo de vida para esta instância.

GetType()

Obtém o Type da instância atual.

(Herdado de Object)
InitializeLifetimeService()
Obsoleto.

Obtém um objeto de serviço de tempo de vida para controlar a política de tempo de vida para essa instância.

MemberwiseClone()

Cria uma cópia superficial do Object atual.

(Herdado de Object)
MemberwiseClone(Boolean)

Cria uma cópia superficial do objeto MarshalByRefObject atual.

ToString()

Retorna uma cadeia de caracteres que representa o objeto atual.

(Herdado de Object)

Aplica-se a