ObjRef クラス
プロキシを生成してリモート オブジェクトと通信するために必要なすべての関連情報を格納します。
この型のすべてのメンバの一覧については、ObjRef メンバ を参照してください。
System.Object
System.Runtime.Remoting.ObjRef
<Serializable>
Public Class ObjRef Implements IObjectReference, ISerializable
[C#]
[Serializable]
public class ObjRef : IObjectReference, ISerializable
[C++]
[Serializable]
public __gc class ObjRef : public IObjectReference, ISerializable
[JScript]
public
Serializable
class ObjRef implements IObjectReference, ISerializable
スレッドセーフ
この型の public static (Visual Basicでは Shared) のすべてのメンバは、マルチスレッド操作で安全に使用できます。インスタンスのメンバの場合は、スレッドセーフであるとは限りません。
解説
ObjRef は、 MarshalByRefObject (MBR) を拡張するオブジェクトのシリアル化可能な表現です。 ObjRef は、 AppDomain 境界を超えてオブジェクト参照を転送するために使用します。オブジェクトの ObjRef を作成することをマーシャリングと言います。MBR オブジェクトをリモート処理インフラストラクチャ (RemotingConfiguration と RemotingServices.Marshal のトピックを参照) に登録することによって明示的に、またはリモート オブジェクトを呼び出すときにパラメータとして MBR オブジェクトを渡すことによって暗黙に ObjRef を作成 (MarshalByRefObject をマーシャリング) できます。リモート処理は、 ObjRef オブジェクトを使用して、リモート処理中の MarshalByRefObject についてのすべての関連情報を格納および送信します。
ObjRef は、マーシャリングしているオブジェクトの Type とクラスを記述する情報、その正確な場所、そのオブジェクトが配置されているリモート処理サブ区分に到達する方法についての通信関連情報を格納します。
MarshalByRefObject を実装しているクラスをマーシャリングした後に、そのクラスを表す ObjRef は、チャネルを通じて別のアプリケーション ドメイン、場合によっては別のプロセスまたはコンピュータに転送されます。 ObjRef は、対象アプリケーション ドメインで逆シリアル化 (「 XML シリアル化および SOAP シリアル化 」を参照) したときに、リモート MBR オブジェクトの透過プロキシを作成するために解析されます。この操作をマーシャリング解除と言います。
透過プロキシは、実際のオブジェクトがクライアントの領域に格納されているように見せかけるオブジェクトです。これは、リモート処理インフラストラクチャを使用して、自らに対する呼び出しを実際のオブジェクトに転送することによって実現されます。透過プロキシ自体は、 RealProxy 型のマネージ ランタイム クラスのインスタンスに格納されます。 RealProxy は、透過プロキシから操作を転送するために必要な機能の一部を実装します。
プロキシ オブジェクトは、 AppDomain 内のリモート処理サブ区分を考慮せずに使用できます。アプリケーションは、プロキシ参照とオブジェクト参照を区別する必要がありません。ただし、アクティベーション、有効期間の管理、トランザクションなどの問題を扱うサービス プロバイダは、このような区別を行う必要があります。
メモ このクラスは、リンク確認要求と継承確認要求をクラス レベルで行います。直前の呼び出し元または派生クラスにインフラストラクチャ アクセス許可がない場合、 SecurityException がスローされます。セキュリティ要求の詳細については、「 リンク確認要求 」および「 継承確認要求 」を参照してください。
使用例
[Visual Basic, C#, C++] カスタム ObjRef の使用方法を示すコード例を次に示します。カスタム ObjRef をテストするアクティベーション コードを表示するには、 RegisterWellKnownServiceType メソッドのトピックの例を参照してください。
' a custom ObjRef class that outputs its status
Public Class MyObjRef
Inherits ObjRef
' only instantiate using marshaling or deserialization
Private Sub New()
End Sub
Public Sub New(ByVal o As MarshalByRefObject, ByVal t As Type)
MyBase.New(o, t)
Console.WriteLine("Created MyObjRef.")
ORDump()
End Sub
Public Sub New(ByVal i As SerializationInfo, ByVal c As StreamingContext)
MyBase.New(i, c)
Console.WriteLine("Deserialized MyObjRef.")
End Sub
Public Overrides Sub GetObjectData(ByVal s As SerializationInfo, ByVal c As StreamingContext)
' After calling the base method, change the type from ObjRef to MyObjRef
MyBase.GetObjectData(s, c)
s.SetType([GetType]())
Console.WriteLine("Serialized MyObjRef.")
End Sub
Public Overrides Function GetRealObject(ByVal context As StreamingContext) As [Object]
If IsFromThisAppDomain() Or IsFromThisProcess() Then
Console.WriteLine("Returning actual object referenced by MyObjRef.")
Return MyBase.GetRealObject(context)
Else
Console.WriteLine("Returning proxy to remote object.")
Return RemotingServices.Unmarshal(Me)
End If
End Function
Public Sub ORDump()
Console.WriteLine(" --- Reporting MyObjRef Info --- ")
Console.WriteLine("Reference to {0}.", TypeInfo.TypeName)
Console.WriteLine("URI is {0}.", URI)
Console.WriteLine(ControlChars.Cr + "Writing EnvoyInfo: ")
If Not (EnvoyInfo Is Nothing) Then
Dim EISinks As IMessageSink = EnvoyInfo.EnvoySinks
Dim count As Integer = 0
While Not (EISinks Is Nothing)
Console.WriteLine(ControlChars.Tab + "Interated through sink #{0}", (count = count + 1))
EISinks = EISinks.NextSink
End While
Else
Console.WriteLine(ControlChars.Tab + " {no sinks}")
End If
Console.WriteLine(ControlChars.Cr + "Writing ChannelInfo: ")
Dim i As Integer
For i = 0 To ChannelInfo.ChannelData.Length - 1
Console.WriteLine(ControlChars.Tab + "Channel: {0}", ChannelInfo.ChannelData(i))
Next i
Console.WriteLine(" ----------------------------- ")
End Sub
End Class
' a class that uses MyObjRef
Public Class LocalObject
Inherits MarshalByRefObject
' overriding CreateObjRef will allow us to return a custom ObjRef
Public Overrides Function CreateObjRef(ByVal t As Type) As ObjRef
Return New MyObjRef(Me, t)
End Function
End Class
[C#]
// a custom ObjRef class that outputs its status
public class MyObjRef : ObjRef {
// only instantiate using marshaling or deserialization
private MyObjRef() { }
public MyObjRef(MarshalByRefObject o, Type t) : base(o, t) {
Console.WriteLine("Created MyObjRef.");
ORDump();
}
public MyObjRef(SerializationInfo i, StreamingContext c) : base(i, c) {
Console.WriteLine("Deserialized MyObjRef.");
}
public override void GetObjectData(SerializationInfo s, StreamingContext c) {
// After calling the base method, change the type from ObjRef to MyObjRef
base.GetObjectData(s, c);
s.SetType(GetType());
Console.WriteLine("Serialized MyObjRef.");
}
public override Object GetRealObject(StreamingContext context) {
if ( IsFromThisAppDomain() || IsFromThisProcess() ) {
Console.WriteLine("Returning actual object referenced by MyObjRef.");
return base.GetRealObject(context);
}
else {
Console.WriteLine("Returning proxy to remote object.");
return RemotingServices.Unmarshal(this);
}
}
public void ORDump() {
Console.WriteLine(" --- Reporting MyObjRef Info --- ");
Console.WriteLine("Reference to {0}.", TypeInfo.TypeName);
Console.WriteLine("URI is {0}.", URI);
Console.WriteLine("\nWriting EnvoyInfo: ");
if ( EnvoyInfo != null) {
IMessageSink EISinks = EnvoyInfo.EnvoySinks;
while (EISinks != null) {
Console.WriteLine("\tSink: " + EISinks.ToString());
EISinks = EISinks.NextSink;
}
}
else
Console.WriteLine("\t {no sinks}");
Console.WriteLine("\nWriting ChannelInfo: ");
for (int i = 0; i < ChannelInfo.ChannelData.Length; i++)
Console.WriteLine ("\tChannel: {0}", ChannelInfo.ChannelData[i]);
Console.WriteLine(" ----------------------------- ");
}
}
// a class that uses MyObjRef
public class LocalObject : MarshalByRefObject {
// overriding CreateObjRef will allow us to return a custom ObjRef
public override ObjRef CreateObjRef(Type t) {
return new MyObjRef(this, t);
}
}
[C++]
// a custom ObjRef class that outputs its status
public __gc class MyObjRef : public ObjRef
{
// only instantiate using marshaling or deserialization
private:
MyObjRef() { }
public:
MyObjRef(MarshalByRefObject* o, Type* t) : ObjRef(o, t)
{
Console::WriteLine(S"Created MyObjRef.");
ORDump();
}
public:
MyObjRef(SerializationInfo* i, StreamingContext c) : ObjRef(i, c)
{
Console::WriteLine(S"Deserialized MyObjRef.");
}
public:
void GetObjectData(SerializationInfo* s, StreamingContext c)
{
// After calling the base method, change the type from ObjRef to MyObjRef
ObjRef::GetObjectData(s, c);
s->SetType(GetType());
Console::WriteLine(S"Serialized MyObjRef.");
}
public:
Object* GetRealObject(StreamingContext context)
{
if (IsFromThisAppDomain() || IsFromThisProcess())
{
Console::WriteLine(S"Returning actual Object* referenced by MyObjRef.");
return ObjRef::GetRealObject(context);
}
else
{
Console::WriteLine(S"Returning proxy to remote Object*.");
return RemotingServices::Unmarshal(this);
}
}
public:
void ORDump()
{
Console::WriteLine(S" --- Reporting MyObjRef Info --- ");
Console::WriteLine(S"Reference to {0}.", TypeInfo->TypeName);
Console::WriteLine(S"URI is {0}.", URI);
Console::WriteLine(S"\nWriting EnvoyInfo: ");
if (EnvoyInfo != 0)
{
IMessageSink* EISinks = EnvoyInfo->EnvoySinks;
while (EISinks != 0) {
Console::WriteLine(S"\tSink: {0}", EISinks);
EISinks = EISinks->NextSink;
}
}
else
Console::WriteLine(S"\t {no sinks}");
Console::WriteLine(S"\nWriting ChannelInfo: ");
for (int i = 0; i < ChannelInfo->ChannelData->Length; i++)
Console::WriteLine (S"\tChannel: {0}", ChannelInfo->ChannelData->Item[i]);
Console::WriteLine(S" ----------------------------- ");
}
};
// a class that uses MyObjRef
public __gc class LocalObject : public MarshalByRefObject
{
// overriding CreateObjRef will allow us to return a custom ObjRef
public:
ObjRef* CreateObjRef(Type* t)
{
return new MyObjRef(this, t);
}
};
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
名前空間: System.Runtime.Remoting
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ
アセンブリ: Mscorlib (Mscorlib.dll 内)
.NET Framework セキュリティ:
- SecurityPermission (インフラストラクチャ コードを操作するために必要なアクセス許可)要求値: SecurityAction.LinkDemand; アクセス許可値: SecurityPermissionFlag.Infrastructure
- SecurityPermission (インフラストラクチャ コードを操作するために必要なアクセス許可)要求値: SecurityAction.InheritanceDemand; アクセス許可値: SecurityPermissionFlag.Infrastructure
参照
ObjRef メンバ | System.Runtime.Remoting 名前空間 | ISerializable | RemotingServices.Marshal | RemotingServices.Unmarshal | RealProxy