ObjRef Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Przechowuje wszystkie istotne informacje wymagane do wygenerowania serwera proxy w celu komunikowania się z obiektem zdalnym.
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
- Dziedziczenie
-
ObjRef
- Atrybuty
- Implementuje
Przykłady
Poniższy przykład kodu przedstawia użycie niestandardowego ObjRefelementu . Aby wyświetlić kod aktywacji, który testuje niestandardowy ObjRefkod , zobacz przykład RegisterWellKnownServiceType metody .
// 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
Uwagi
A ObjRef to serializacyjna reprezentacja obiektu, który rozszerza MarshalByRefObject (MBR). Element A ObjRef służy do transferu odwołania do obiektu przez granicę AppDomain . Tworzenie obiektu ObjRef dla obiektu jest nazywane marshalingiem. Można utworzyć obiekt (marshal a MarshalByRefObjectObjRef ) jawnie, rejestrując obiekt MBR przy użyciu infrastruktury komunikacji zdalnej (zobacz RemotingConfiguration i RemotingServices.Marshal), lub niejawnie, przekazując obiekt MBR jako parametr podczas wywoływania obiektu zdalnego. Komunikacja zdalna używa ObjRef obiektów do przechowywania i przesyłania wszystkich istotnych informacji o zdalnym MarshalByRefObject kodzie.
Zawiera ObjRef informacje, które opisują klasę Type i obiektu, który jest marshaled, jego dokładną lokalizację i informacje dotyczące komunikacji na temat sposobu dotarcia do podsieci komunikacji, w której znajduje się obiekt.
Po przeprowadzeniu marshalingu MarshalByRefObject klasy oznacza to, ObjRef że jest on przesyłany za pośrednictwem kanału do innej domeny aplikacji, prawdopodobnie w innym procesie lub komputerze. Gdy obiekt ObjRef jest deserializowany (zobacz kod XML i serializacja protokołu SOAP) w domenie docelowej aplikacji, jest analizowany w celu utworzenia przezroczystego serwera proxy dla zdalnego obiektu MBR. Ta operacja jest znana jako unmarshaling.
Przezroczysty serwer proxy to obiekt, który zapewnia iluzję, że rzeczywisty obiekt znajduje się w przestrzeni klienta. Pozwala to osiągnąć przez przekazywanie wywołań wykonanych na nim do rzeczywistego obiektu przy użyciu infrastruktury komunikacji telefonicznej. Przezroczysty serwer proxy jest sam w domu przez wystąpienie zarządzanej klasy czasu wykonywania typu RealProxy. Implementuje RealProxy część funkcjonalności wymaganą do przekazywania operacji z przezroczystego serwera proxy.
Obiekt serwera proxy może być używany bez względu na jakiekolwiek podsieci komunikacji zdalnie w obrębie AppDomainobiektu . Aplikacje nie muszą rozróżniać odwołań serwera proxy i odwołań do obiektów. Jednak dostawcy usług, którzy zajmują się problemami, takimi jak aktywacja, zarządzanie okresem istnienia i transakcje, muszą dokonać takich różnic.
Ta klasa sprawia, że żądanie połączenia i zapotrzebowanie na dziedziczenie na poziomie klasy. Element jest SecurityException zgłaszany, gdy obiekt wywołujący natychmiast lub klasa pochodna nie ma uprawnień infrastruktury. Aby uzyskać szczegółowe informacje na temat wymagań dotyczących zabezpieczeń, zobacz Łączenie żądań i żądań dziedziczenia.
Konstruktory
ObjRef() |
Inicjuje nowe wystąpienie klasy ObjRef z domyślnymi wartościami. |
ObjRef(MarshalByRefObject, Type) |
Inicjuje ObjRef nowe wystąpienie klasy, aby odwołać się do określonego MarshalByRefObject elementu Type. |
ObjRef(SerializationInfo, StreamingContext) |
Inicjuje ObjRef nowe wystąpienie klasy z serializacji danych. |
Właściwości
ChannelInfo |
Pobiera lub ustawia wartość IChannelInfo dla parametru ObjRef. |
EnvoyInfo |
Pobiera lub ustawia wartość IEnvoyInfo dla parametru ObjRef. |
TypeInfo |
Pobiera lub ustawia IRemotingTypeInfo obiekt, który ObjRef opisuje. |
URI |
Pobiera lub ustawia identyfikator URI określonego wystąpienia obiektu. |
Metody
Equals(Object) |
Określa, czy dany obiekt jest taki sam, jak bieżący obiekt. (Odziedziczone po Object) |
GetHashCode() |
Służy jako domyślna funkcja skrótu. (Odziedziczone po Object) |
GetObjectData(SerializationInfo, StreamingContext) |
Wypełnia określony SerializationInfo element danymi wymaganymi do serializacji bieżącego ObjRef wystąpienia. |
GetRealObject(StreamingContext) |
Zwraca odwołanie do obiektu zdalnego, który ObjRef opisuje. |
GetType() |
Type Pobiera bieżące wystąpienie. (Odziedziczone po Object) |
IsFromThisAppDomain() |
Zwraca wartość logiczną wskazującą, czy bieżące ObjRef wystąpienie odwołuje się do obiektu znajdującego się w bieżącym AppDomainobiekcie . |
IsFromThisProcess() |
Zwraca wartość logiczną wskazującą, czy bieżące ObjRef wystąpienie odwołuje się do obiektu znajdującego się w bieżącym procesie. |
MemberwiseClone() |
Tworzy płytkią kopię bieżącego Objectelementu . (Odziedziczone po Object) |
ToString() |
Zwraca ciąg reprezentujący bieżący obiekt. (Odziedziczone po Object) |