MarshalByRefObject MarshalByRefObject MarshalByRefObject MarshalByRefObject Class

Definition

Consente l'accesso a oggetti attraverso limiti di dominio nelle applicazioni che supportano servizi remoti. Enables access to objects across application domain boundaries in applications that support remoting.

public ref class MarshalByRefObject abstract
[System.Runtime.InteropServices.ComVisible(true)]
[Serializable]
public abstract class MarshalByRefObject
type MarshalByRefObject = class
Public MustInherit Class MarshalByRefObject
Inheritance
MarshalByRefObjectMarshalByRefObjectMarshalByRefObjectMarshalByRefObject
Derived
Attributes
ComVisibleAttribute SerializableAttribute

Examples

In questa sezione sono riportati due esempi di codice.This section contains two code examples. Il primo esempio di codice viene illustrato come creare un'istanza di una classe in un altro dominio applicazione.The first code example shows how to create an instance of a class in another application domain. Il secondo esempio di codice viene illustrata una classe semplice che può essere utilizzata per la comunicazione remota.The second code example shows a simple class that can be used for remoting.

Esempio 1Example 1

Esempio di codice seguente viene illustrato il modo più semplice per eseguire codice in un altro dominio applicazione.The following code example shows the simplest way to execute code in another application domain. L'esempio definisce una classe denominata Worker che eredita MarshalByRefObject, con un metodo che visualizza il nome del dominio dell'applicazione in cui è in esecuzione.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. L'esempio crea istanze di Worker nel dominio dell'applicazione predefinito in un nuovo dominio applicazione.The example creates instances of Worker in the default application domain and in a new application domain.

Nota

L'assembly contenente Worker devono essere caricati in entrambi i domini applicazione, ma è stato possibile caricare gli altri assembly che esistono solo nel nuovo dominio applicazione.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"

Esempio 2Example 2

L'esempio seguente illustra una classe derivata da MarshalByRefObject vale a dire usati più avanti in .NET 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

Remarks

Un dominio dell'applicazione è una partizione in un processo del sistema operativo in cui risiedono una o più applicazioni.An application domain is a partition in an operating system process where one or more applications reside. Gli oggetti nello stesso dominio dell'applicazione possono comunicare direttamente.Objects in the same application domain communicate directly. Gli oggetti in diversi domini applicazione comunicano tramite il trasporto di copie di oggetti tra i limiti del dominio dell'applicazione o tramite un proxy per lo scambio di messaggi.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 classe base per gli oggetti che comunicano attraverso limiti di dominio per lo scambio di messaggi tramite un proxy.MarshalByRefObject is the base class for objects that communicate across application domain boundaries by exchanging messages using a proxy. Gli oggetti che non ereditano da MarshalByRefObject sono implicitamente il marshalling per valore.Objects that do not inherit from MarshalByRefObject are implicitly marshal by value. Quando un'operazione di marshalling fa riferimento a un'applicazione remota dall'oggetto di valore, una copia dell'oggetto viene passata attraverso limiti di dominio.When a remote application references a marshal by value object, a copy of the object is passed across application domain boundaries.

MarshalByRefObject gli oggetti sono accessibili direttamente all'interno del dominio dell'applicazione locale.MarshalByRefObject objects are accessed directly within the boundaries of the local application domain. La prima volta un'applicazione remota a un dominio dell'applicazione accede a un MarshalByRefObject, un proxy viene passato all'applicazione remota.The first time an application in a remote application domain accesses a MarshalByRefObject, a proxy is passed to the remote application. Vengono effettuato il marshalling di chiamate successive nel proxy all'oggetto che si trovano nel dominio dell'applicazione locale.Subsequent calls on the proxy are marshaled back to the object residing in the local application domain.

I tipi devono ereditare da MarshalByRefObject quando viene utilizzato il tipo superando i limiti di dominio di 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 creati.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.

Quando si deriva un oggetto da MarshalByRefObject per l'uso oltre i limiti di dominio dell'applicazione, eseguire l'override di uno qualsiasi dei relativi membri, né deve chiamarne i metodi direttamente.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. Il runtime riconosce che le classi derivate da MarshalByRefObject deve eseguire il marshalling fra i limiti dei domini di app.The runtime recognizes that classes derived from MarshalByRefObject should be marshaled across app domain boundaries.

Constructors

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

Inizializza una nuova istanza della classe MarshalByRefObject. Initializes a new instance of the MarshalByRefObject class.

Methods

CreateObjRef(Type) CreateObjRef(Type) CreateObjRef(Type) 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. 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 se l'oggetto specificato è uguale all'oggetto corrente. Determines whether the specified object is equal to the current object.

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

Funge da funzione hash predefinita. Serves as the default hash function.

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

Consente di recuperare l'oggetto servizio di durata corrente per controllare i criteri di durata per l'istanza. Retrieves the current lifetime service object that controls the lifetime policy for this instance.

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

Ottiene l'oggetto Type dell'istanza corrente. Gets the Type of the current instance.

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

Ottiene un oggetto servizio di durata per controllare i criteri di durata per questa istanza. Obtains a lifetime service object to control the lifetime policy for this instance.

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

Crea una copia superficiale dell'oggetto Object corrente. Creates a shallow copy of the current Object.

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

Crea una copia dei riferimenti dell'oggetto MarshalByRefObject corrente. Creates a shallow copy of the current MarshalByRefObject object.

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

Restituisce una stringa che rappresenta l'oggetto corrente. Returns a string that represents the current object.

(Inherited from Object)

Applies to