MarshalByRefObject MarshalByRefObject MarshalByRefObject MarshalByRefObject Class

定義

リモート処理をサポートするアプリケーションで、アプリケーションのドメインの境界を越えてオブジェクトにアクセスできるようにします。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
継承
MarshalByRefObjectMarshalByRefObjectMarshalByRefObjectMarshalByRefObject
派生
属性

このセクションには、2 つのコード例が含まれています。This section contains two code examples. 最初のコード例では、別のアプリケーションドメインにクラスのインスタンスを作成する方法を示します。The first code example shows how to create an instance of a class in another application domain. 2番目のコード例は、リモート処理に使用できる単純なクラスを示しています。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

注釈

アプリケーションドメインは、1つまたは複数のアプリケーションが存在するオペレーティングシステムプロセス内のパーティションです。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() MarshalByRefObject() MarshalByRefObject()

MarshalByRefObject クラスの新しいインスタンスを初期化します。Initializes a new instance of the MarshalByRefObject class.

メソッド

CreateObjRef(Type) CreateObjRef(Type) CreateObjRef(Type) 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) Equals(Object) Equals(Object) Equals(Object)

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。Determines whether the specified object is equal to the current object.

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

既定のハッシュ関数として機能します。Serves as the default hash function.

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

対象のインスタンスの有効期間ポリシーを制御する、現在の有効期間サービス オブジェクトを取得します。Retrieves the current lifetime service object that controls the lifetime policy for this instance.

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

現在のインスタンスの Type を取得します。Gets the Type of the current instance.

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

このインスタンスの有効期間ポリシーを制御する有効期間サービス オブジェクトを取得します。Obtains a lifetime service object to control the lifetime policy for this instance.

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

現在の Object の簡易コピーを作成します。Creates a shallow copy of the current Object.

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

現在の MarshalByRefObject オブジェクトの簡易コピーを作成します。Creates a shallow copy of the current MarshalByRefObject object.

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

現在のオブジェクトを表す文字列を返します。Returns a string that represents the current object.

(Inherited from Object)

適用対象