Sdílet prostřednictvím


MarshalByRefObject Třída

Definice

Umožňuje přístup k objektům napříč hranicemi domény aplikace v aplikacích, které podporují vzdálenou komunikace.

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
Dědičnost
MarshalByRefObject
Odvozené
Atributy

Příklady

Tato část obsahuje dva příklady kódu. První příklad kódu ukazuje, jak vytvořit instanci třídy v jiné doméně aplikace. Druhý příklad kódu ukazuje jednoduchou třídu, kterou lze použít pro vzdálenou komunikace.

Příklad 1

Následující příklad kódu ukazuje nejjednodušší způsob spuštění kódu v jiné doméně aplikace. Příklad definuje třídu s názvem , která dědí , pomocí metody , která zobrazuje název domény aplikace, Worker MarshalByRefObject ve které je spuštěn. Příklad vytvoří instance ve Worker výchozí doméně aplikace a v nové doméně aplikace.

Poznámka

Sestavení, které obsahuje, musí být načteno do obou domén aplikace, ale mohlo by načíst jiná sestavení, která by existovala pouze Worker v nové doméně aplikace.

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"

Příklad 2

Následující příklad ukazuje třídu odvozenou z MarshalByRefObject , která je použita později při vzdálené komunikace.

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

Poznámky

Doména aplikace je oddíl v procesu operačního systému, ve kterém se nachází jedna nebo více aplikací. Objekty ve stejné doméně aplikace komunikují přímo. Objekty v různých doménách aplikace komunikují buď přenosem kopií objektů přes hranice domény aplikace, nebo pomocí proxy serveru pro výměnu zpráv.

MarshalByRefObject je základní třída pro objekty, které komunikují přes hranice aplikační domény výměnou zpráv pomocí proxy serveru. Objekty, které nezdědí MarshalByRefObject z , jsou implicitně zařazeny podle hodnoty. Když vzdálená aplikace odkazuje na objekt zařazování podle hodnoty, kopie objektu je předána přes hranice domény aplikace.

MarshalByRefObject Objekty jsou přístupné přímo v rámci hranic místní domény aplikace. Když aplikace ve vzdálené doméně aplikace poprvé přistupuje k , předá se vzdálené aplikaci MarshalByRefObject proxy server. Následná volání na proxy serveru se zařazují zpět do objektu, který se nachází v místní doméně aplikace.

Typy musí dědit z při použití typu přes hranice domény aplikace a stav objektu nesmí být zkopírován, protože členy objektu nelze použít mimo doménu aplikace, kde byly MarshalByRefObject vytvořeny.

Když odvodíte objekt z pro použití napříč hranicemi domény aplikace, neměli byste přepsat žádné jeho členy, ani volat MarshalByRefObject jeho metody přímo. Modul runtime rozpozná, že třídy odvozené z by MarshalByRefObject měly být zařazeny napříč hranicemi domény aplikace.

Konstruktory

MarshalByRefObject()

Inicializuje novou instanci MarshalByRefObject třídy .

Metody

CreateObjRef(Type)

Vytvoří objekt, který obsahuje všechny relevantní informace potřebné k vygenerování proxy serveru používaného ke komunikaci se vzdáleným objektem.

Equals(Object)

Určí, zda se zadaný objekt rovná aktuálnímu objektu.

(Zděděno od Object)
GetHashCode()

Slouží jako výchozí funkce hash.

(Zděděno od Object)
GetLifetimeService()
Zastaralé.

Načte aktuální objekt služby životnosti, který řídí zásady životnosti pro tuto instanci.

GetType()

Type Získá aktuální instanci.

(Zděděno od Object)
InitializeLifetimeService()
Zastaralé.

Získá objekt služby životnosti pro řízení zásad životnosti pro tuto instanci.

MemberwiseClone()

Vytvoří použádnou kopii aktuálního souboru Object.

(Zděděno od Object)
MemberwiseClone(Boolean)

Vytvoří kopii aktuálního objektu bez MarshalByRefObject podmět.

ToString()

Vrátí řetězec, který představuje aktuální objekt.

(Zděděno od Object)

Platí pro