MarshalByRefObject Class

정의

원격 통신을 지원하는 응용 프로그램에서 응용 프로그램 도메인 경계를 넘어 개체에 액세스할 수 있습니다. Enables access to objects across application domain boundaries in applications that support remoting.

[System.Runtime.InteropServices.ComVisible(true)]
public abstract 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. 마샬링을 값 개체에서 참조 하는 원격 응용 프로그램을 하는 경우 응용 프로그램 도메인 경계를 넘어 개체의 복사본이 전달 됩니다.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.

(Inherited from Object)
GetHashCode()

기본 해시 함수로 작동합니다. Serves as the default hash function.

(Inherited from 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.

(Inherited from 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.

(Inherited from Object)
MemberwiseClone(Boolean)

현재 MarshalByRefObject 개체의 단순 복사본을 만듭니다. Creates a shallow copy of the current MarshalByRefObject object.

ToString()

현재 개체를 나타내는 문자열을 반환합니다. Returns a string that represents the current object.

(Inherited from Object)

적용 대상