ObjRef Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Speichert alle relevanten Informationen, die zum Generieren eines Proxys für die Kommunikation mit einem Remoteobjekt erforderlich sind.
public ref class ObjRef : System::Runtime::Serialization::IObjectReference, System::Runtime::Serialization::ISerializable
[System.Serializable]
public class ObjRef : System.Runtime.Serialization.IObjectReference, System.Runtime.Serialization.ISerializable
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class ObjRef : System.Runtime.Serialization.IObjectReference, System.Runtime.Serialization.ISerializable
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
[System.Security.SecurityCritical]
public class ObjRef : System.Runtime.Serialization.IObjectReference, System.Runtime.Serialization.ISerializable
[<System.Serializable>]
type ObjRef = class
interface IObjectReference
interface ISerializable
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type ObjRef = class
interface IObjectReference
interface ISerializable
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
[<System.Security.SecurityCritical>]
type ObjRef = class
interface IObjectReference
interface ISerializable
Public Class ObjRef
Implements IObjectReference, ISerializable
- Vererbung
-
ObjRef
- Attribute
- Implementiert
Beispiele
Im folgenden Codebeispiel wird die Verwendung eines benutzerdefinierten ObjRefveranschaulicht. Um den Aktivierungscode anzuzeigen, der die benutzerdefinierte ObjReftestet, sehen Sie sich das Beispiel für die -Methode an RegisterWellKnownServiceType .
// a custom ObjRef class that outputs its status
[System::Security::Permissions::SecurityPermissionAttribute(
System::Security::Permissions::SecurityAction::Demand,
Flags=System::Security::Permissions::SecurityPermissionFlag::SerializationFormatter)]
[System::Security::Permissions::SecurityPermissionAttribute
(System::Security::Permissions::SecurityAction::Demand,
Flags=System::Security::Permissions::SecurityPermissionFlag::Infrastructure)]
[System::Security::Permissions::SecurityPermissionAttribute
(System::Security::Permissions::SecurityAction::InheritanceDemand,
Flags=System::Security::Permissions::SecurityPermissionFlag::Infrastructure)]
public ref class MyObjRef: public ObjRef
{
private:
// only instantiate using marshaling or deserialization
MyObjRef(){}
public:
MyObjRef( MarshalByRefObject^ o, Type^ t )
: ObjRef( o, t )
{
Console::WriteLine( "Created MyObjRef." );
ORDump();
}
MyObjRef( SerializationInfo^ i, StreamingContext c )
: ObjRef( i, c )
{
Console::WriteLine( "Deserialized MyObjRef." );
}
virtual void GetObjectData( SerializationInfo^ s, StreamingContext c ) override
{
// After calling the base method, change the type from ObjRef to MyObjRef
ObjRef::GetObjectData( s, c );
s->SetType( GetType() );
Console::WriteLine( "Serialized MyObjRef." );
}
virtual Object^ GetRealObject( StreamingContext context ) override
{
if ( IsFromThisAppDomain() || IsFromThisProcess() )
{
Console::WriteLine( "Returning actual Object^ referenced by MyObjRef." );
return ObjRef::GetRealObject( context );
}
else
{
Console::WriteLine( "Returning proxy to remote Object^." );
return RemotingServices::Unmarshal( this );
}
}
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 != nullptr )
{
IMessageSink^ EISinks = EnvoyInfo->EnvoySinks;
while ( EISinks != nullptr )
{
Console::WriteLine( "\tSink: {0}", EISinks );
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 ref class LocalObject: public MarshalByRefObject
{
public:
// overriding CreateObjRef will allow us to return a custom ObjRef
[System::Security::Permissions::SecurityPermissionAttribute
(System::Security::Permissions::SecurityAction::LinkDemand,
Flags=System::Security::Permissions::SecurityPermissionFlag::Infrastructure)]
virtual ObjRef^ CreateObjRef( Type^ t ) override
{
return gcnew MyObjRef( this,t );
}
};
// 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);
}
}
' a custom ObjRef class that outputs its status
<PermissionSet(SecurityAction.Demand, Name:="FullTrust")> _
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
<PermissionSet(SecurityAction.Demand, Name:="FullTrust")> _
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
Hinweise
Ein ObjRef ist eine serialisierbare Darstellung eines Objekts, das erweitert MarshalByRefObject (MBR). Ein ObjRef wird verwendet, um einen Objektverweis über eine AppDomain Grenze zu übertragen. Das Erstellen eines ObjRef für ein Objekt wird als Marshalling bezeichnet. Sie können ein ObjRef erstellen (marshallen eine MarshalByRefObject), entweder explizit, indem Sie das MBR-Objekt bei der Remotinginfrastruktur registrieren (siehe RemotingConfiguration und RemotingServices.Marshal), oder implizit, indem Sie beim Aufrufen eines Remoteobjekts ein MBR-Objekt als Parameter übergeben. Remoting verwendet ObjRef Objekte, um alle relevanten Informationen zu speichern und zu übertragen, die MarshalByRefObject entfernt werden.
ObjRef enthält Informationen, die die Type - und -Klasse des gemarshallten Objekts, seine genaue Position und kommunikationsbezogene Informationen zum Erreichen der Remotingunterteilung, in der sich das Objekt befindet, beschreiben.
Nachdem eine Klasse, die implementiert MarshalByRefObject , gemarshallt wurde, wird die , die ObjRef sie darstellt, über einen Kanal in eine andere Anwendungsdomäne übertragen, möglicherweise in einem anderen Prozess oder Computer. Wenn in der ObjRef Zielanwendungsdomäne deserialisiert wird (siehe XML- und SOAP-Serialisierung), wird es analysiert, um einen transparenten Proxy für das MBR-Remoteobjekt zu erstellen. Dieser Vorgang wird als entmarshaling bezeichnet.
Ein transparenter Proxy ist ein Objekt, das die Illusion vermittelt, dass sich das tatsächliche Objekt im Clientbereich befindet. Dies wird erreicht, indem Aufrufe an das reale Objekt mithilfe der Remotinginfrastruktur weitergeleitet werden. Der transparente Proxy ist selbst in einer Instanz einer verwalteten Laufzeitklasse vom Typ RealProxyuntergebracht. RealProxy Implementiert einen Teil der Funktionalität, die erforderlich ist, um die Vorgänge vom transparenten Proxy weiterzuleiten.
Ein Proxyobjekt kann ohne Rücksicht auf Remotingunterteilungen innerhalb eines AppDomainverwendet werden. Anwendungen müssen nicht zwischen Proxyverweise und Objektverweise unterscheiden. Dienstanbieter, die sich mit Problemen wie Aktivierung, Verwaltung der Lebensdauer und Transaktionen befassen, müssen jedoch solche Unterschiede treffen.
Diese Klasse stellt eine Linkanforderung und eine Vererbungsanforderung auf Klassenebene her. Ein SecurityException wird ausgelöst, wenn entweder der unmittelbare Aufrufer oder die abgeleitete Klasse über keine Infrastrukturberechtigung verfügt. Ausführliche Informationen zu Sicherheitsanforderungen finden Sie unter Linkanforderungen und Vererbungsanforderungen.
Konstruktoren
ObjRef() |
Initialisiert eine neue Instanz der ObjRef-Klasse mit Standardwerten. |
ObjRef(MarshalByRefObject, Type) |
Initialisiert eine neue Instanz der ObjRef-Klasse, um auf ein angegebenes MarshalByRefObject eines angegebenen Type zu verweisen. |
ObjRef(SerializationInfo, StreamingContext) |
Initialisiert anhand von serialisierten Daten eine neue Instanz der ObjRef-Klasse. |
Eigenschaften
ChannelInfo |
Ruft die IChannelInfo für den ObjRef ab oder legt diese fest. |
EnvoyInfo |
Ruft die IEnvoyInfo für den ObjRef ab oder legt diese fest. |
TypeInfo |
Ruft die IRemotingTypeInfo für das Objekt ab, das ObjRef beschreibt, oder legt diese fest. |
URI |
Ruft den URI der angegebenen Objektinstanz ab oder legt diesen fest. |
Methoden
Equals(Object) |
Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist. (Geerbt von Object) |
GetHashCode() |
Fungiert als Standardhashfunktion. (Geerbt von Object) |
GetObjectData(SerializationInfo, StreamingContext) |
Füllt eine angegebene SerializationInfo mit den Daten aus, die für die Serialisierung der aktuellen ObjRef-Instanz erforderlich sind. |
GetRealObject(StreamingContext) |
Gibt einen Verweis auf das von ObjRef beschriebene Remoteobjekt zurück. |
GetType() |
Ruft den Type der aktuellen Instanz ab. (Geerbt von Object) |
IsFromThisAppDomain() |
Gibt einen booleschen Wert zurück, der angibt, ob die aktuelle ObjRef-Instanz auf ein Objekt verweist, das sich in der aktuellen AppDomain befindet. |
IsFromThisProcess() |
Gibt einen booleschen Wert zurück, der angibt, ob die aktuelle ObjRef-Instanz auf ein Objekt verweist, das sich im aktuellen Prozess befindet. |
MemberwiseClone() |
Erstellt eine flache Kopie des aktuellen Object. (Geerbt von Object) |
ToString() |
Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt. (Geerbt von Object) |