Leggere in inglese

Condividi tramite


MarshalByRefObject Classe

Definizione

Consente l'accesso a oggetti attraverso limiti di dominio nelle applicazioni che supportano servizi remoti.

C#
public abstract class MarshalByRefObject
C#
[System.Serializable]
public abstract class MarshalByRefObject
C#
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class MarshalByRefObject
Ereditarietà
MarshalByRefObject
Derivato
Attributi

Esempio

In questa sezione sono riportati due esempi di codice. Il primo esempio di codice illustra come creare un'istanza di una classe in un altro dominio applicazione. Il secondo esempio di codice mostra una classe semplice che può essere usata per la comunicazione remota.

Esempio 1

L'esempio di codice seguente illustra il modo più semplice per eseguire codice in un altro dominio applicazione. Nell'esempio viene definita una classe denominata che eredita , con un metodo che visualizza il nome del dominio applicazione Worker in cui è in MarshalByRefObject esecuzione. Nell'esempio vengono create istanze Worker di nel dominio applicazione predefinito e in un nuovo dominio applicazione.

Nota

L'assembly che contiene deve essere caricato in entrambi i domini applicazione, ma potrebbe caricare altri assembly che esisterebbero solo Worker nel nuovo dominio applicazione.

C#
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"
 */

Esempio 2

Nell'esempio seguente viene illustrata una classe derivata MarshalByRefObject da che viene usata più avanti nella comunicazione remota.

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

Commenti

Un dominio applicazione è una partizione in un processo del sistema operativo in cui risiedono una o più applicazioni. Gli oggetti nello stesso dominio applicazione comunicano direttamente. Gli oggetti in domini applicazione diversi comunicano trasportando copie di oggetti tra i limiti del dominio applicazione o usando un proxy per lo scambio di messaggi.

MarshalByRefObject è la classe di base per gli oggetti che comunicano attraverso i limiti del dominio applicazione scambiando messaggi tramite un proxy. Gli oggetti che non ereditano da vengono MarshalByRefObject sottoposti a marshalling implicito per valore. Quando un'applicazione remota fa riferimento a un oggetto marshalling in base al valore, una copia dell'oggetto viene passata attraverso i limiti del dominio applicazione.

MarshalByRefObject Gli oggetti sono accessibili direttamente all'interno dei limiti del dominio applicazione locale. La prima volta che un'applicazione in un dominio applicazione remoto accede a , viene passato un MarshalByRefObject proxy all'applicazione remota. Viene eseguito il marshalling delle chiamate successive sul proxy all'oggetto che risiede nel dominio applicazione locale.

I tipi devono ereditare da quando il tipo viene usato oltre i limiti del dominio applicazione e lo stato dell'oggetto non deve essere copiato perché i membri dell'oggetto non sono utilizzabili all'esterno del dominio applicazione in cui sono stati MarshalByRefObject creati.

Quando si deriva un oggetto da per l'uso tra i limiti del dominio applicazione, non è necessario eseguire l'override di alcun membro né chiamare MarshalByRefObject direttamente i relativi metodi. Il runtime riconosce che le classi derivate da MarshalByRefObject devono essere sottoposti a marshalling tra i limiti del dominio dell'app.

Costruttori

MarshalByRefObject()

Inizializza una nuova istanza della classe MarshalByRefObject.

Metodi

CreateObjRef(Type)

Consente di creare un oggetto che contiene tutte le informazioni rilevanti necessarie per la generazione del proxy utilizzato per effettuare la comunicazione con un oggetto remoto.

Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.

(Ereditato da Object)
GetHashCode()

Funge da funzione hash predefinita.

(Ereditato da Object)
GetLifetimeService()
Obsoleta.

Consente di recuperare l'oggetto servizio di durata corrente per controllare i criteri di durata per l'istanza.

GetType()

Ottiene l'oggetto Type dell'istanza corrente.

(Ereditato da Object)
InitializeLifetimeService()
Obsoleta.

Ottiene un oggetto servizio di durata per controllare i criteri di durata per questa istanza.

MemberwiseClone()

Crea una copia superficiale dell'oggetto Object corrente.

(Ereditato da Object)
MemberwiseClone(Boolean)

Crea una copia dei riferimenti dell'oggetto MarshalByRefObject corrente.

ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.

(Ereditato da Object)

Si applica a

Prodotto Versioni
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 2.0, 2.1