MarshalByRefObject Класс

Определение

Разрешает доступ к объектам через границы доменов приложения в приложениях, поддерживающих удаленное взаимодействие.Enables access to objects across application domain boundaries in applications that support remoting.

public ref class MarshalByRefObject abstract
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public abstract class MarshalByRefObject
type MarshalByRefObject = class
Public MustInherit Class MarshalByRefObject
Наследование
MarshalByRefObject
Производный
Атрибуты

Примеры

Этот раздел содержит два примера кода.This section contains two code examples. В первом примере кода показано, как создать экземпляр класса в другом домене приложения.The first code example shows how to create an instance of a class in another application domain. Во втором примере кода показан простой класс, который можно использовать для удаленного взаимодействия.The second code example shows a simple class that can be used for remoting.

Пример 1Example 1

В следующем примере кода показан самый простой способ выполнения кода в другом домене приложения.The following code example shows the simplest way to execute code in another application domain. В примере определяется класс с именем Worker , MarshalByRefObjectнаследуемый с помощью метода, который отображает имя домена приложения, в котором оно выполняется.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. В примере создаются экземпляры Worker в домене приложения по умолчанию и в новом домене приложения.The example creates instances of Worker in the default application domain and in a new application domain.

Примечание

Сборка, которая содержит Worker , должна быть загружена в оба домена приложений, но может загружать другие сборки, которые будут существовать только в новом домене приложения.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"

Пример 2Example 2

В следующем примере показан класс, производный MarshalByRefObject от, который используется позже в удаленном взаимодействии.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

Комментарии

Домен приложения — это раздел в процессе операционной системы, в котором находятся одно или несколько приложений.An application domain is a partition in an operating system process where one or more applications reside. Объекты в одном домене приложения взаимодействуют напрямую.Objects in the same application domain communicate directly. Объекты в разных доменах приложений взаимодействуют либо посредством передачи копий объектов через границы домена приложения, либо с помощью прокси-сервера для обмена сообщениями.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является базовым классом для объектов, взаимодействующих через границы доменов приложений путем обмена сообщениями с помощью прокси-сервера.MarshalByRefObject is the base class for objects that communicate across application domain boundaries by exchanging messages using a proxy. Объекты, которые не наследуют MarshalByRefObject от, неявно маршалируются по значению.Objects that do not inherit from MarshalByRefObject are implicitly marshal by value. Если удаленное приложение ссылается на объект Marshal по значению, то копия объекта передается через границы домена приложения.When a remote application references a marshal by value object, a copy of the object is passed across application domain boundaries.

MarshalByRefObjectдоступ к объектам осуществляется непосредственно в границах локального домена приложения.MarshalByRefObject objects are accessed directly within the boundaries of the local application domain. Когда приложение в удаленном домене приложения получает доступ MarshalByRefObjectк, прокси-сервер передается удаленному приложению.The first time an application in a remote application domain accesses a MarshalByRefObject, a proxy is passed to the remote application. Последующие вызовы прокси-сервера маршалируются обратно в объект, находящийся в локальном домене приложения.Subsequent calls on the proxy are marshaled back to the object residing in the local application domain.

Типы должны наследоваться от MarshalByRefObject , если тип используется через границы домена приложения, а состояние объекта не должно быть скопировано, так как члены объекта не могут использоваться вне домена приложения, в котором они были созданы.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.

При наследовании объекта из MarshalByRefObject для использования в границах домена приложения не следует переопределять ни один из его членов, а также не следует вызывать его методы напрямую.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. Среда выполнения распознает, что классы MarshalByRefObject , производные от, должны быть упакованы через границы домена приложения.The runtime recognizes that classes derived from MarshalByRefObject should be marshaled across app domain boundaries.

Конструкторы

MarshalByRefObject()

Инициализирует новый экземпляр класса MarshalByRefObject.Initializes a new instance of the MarshalByRefObject class.

Методы

CreateObjRef(Type)

Создает объект, который содержит всю необходимую информацию для создания прокси-сервера, используемого для взаимодействия с удаленным объектом.Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object.

Equals(Object)

Определяет, равен ли заданный объект текущему объекту.Determines whether the specified object is equal to the current object.

(Унаследовано от Object)
GetHashCode()

Служит хэш-функцией по умолчанию.Serves as the default hash function.

(Унаследовано от Object)
GetLifetimeService()

Извлекает объект обслуживания во время существования, который управляет политикой времени существования данного экземпляра.Retrieves the current lifetime service object that controls the lifetime policy for this instance.

GetType()

Возвращает объект Type для текущего экземпляра.Gets the Type of the current instance.

(Унаследовано от Object)
InitializeLifetimeService()

Получает объект службы времени существования для управления политикой времени существования для этого экземпляра.Obtains a lifetime service object to control the lifetime policy for this instance.

MemberwiseClone()

Создает неполную копию текущего объекта Object.Creates a shallow copy of the current Object.

(Унаследовано от Object)
MemberwiseClone(Boolean)

Создает неполную копию текущего объекта MarshalByRefObject.Creates a shallow copy of the current MarshalByRefObject object.

ToString()

Возвращает строку, представляющую текущий объект.Returns a string that represents the current object.

(Унаследовано от Object)

Применяется к