ObjRef Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Ukládá všechny relevantní informace potřebné k vygenerování proxy serveru pro komunikaci se vzdáleným objektem.
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
- Dědičnost
-
ObjRef
- Atributy
- Implementuje
Příklady
Následující příklad kódu ukazuje použití vlastní ObjRef. Pokud chcete zobrazit aktivační kód, který testuje vlastní ObjRefkód, podívejte se na příklad metody 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
Poznámky
A ObjRef je serializovatelná reprezentace objektu, který rozšiřuje MarshalByRefObject (MBR). A ObjRef slouží k přenosu odkazu na objekt přes AppDomain hranici. ObjRef Vytvoření objektu se označuje jako zařazování. Explicitně můžete vytvořit ObjRef (marshal a MarshalByRefObject) registrací objektu MBR v infrastruktuře vzdálené komunikace (viz RemotingConfiguration a RemotingServices.Marshal) nebo implicitně předáním objektu MBR jako parametru při volání vzdáleného objektu. Vzdálená komunikace používá ObjRef objekty k ukládání a přenosu všech relevantních informací o MarshalByRefObject vzdáleném umístění.
Obsahuje ObjRef informace popisující Type a třídu zařazovaného objektu, jeho přesné umístění a informace související s komunikací o tom, jak se dostat ke vzdálené subdivision, kde se objekt nachází.
Po zařazování MarshalByRefObject třídy, ObjRef který představuje, je přenesen prostřednictvím kanálu do jiné domény aplikace, pravděpodobně v jiném procesu nebo počítači. ObjRef Při deserializaci (viz serializace XML a SOAP) v cílové aplikační doméně se parsuje pro vytvoření transparentního proxy pro vzdálený objekt MBR. Tato operace se označuje jako unmarshaling.
Transparentní proxy server je objekt, který poskytuje iluzi, že skutečný objekt se nachází v prostoru klienta. Dosahuje toho přesměrováním volání provedených na skutečný objekt pomocí infrastruktury vzdálené komunikace. Transparentní proxy server je umístěn v instanci spravované třídy runtime typu RealProxy. Implementuje RealProxy část funkce potřebné k předávání operací z transparentního proxy serveru.
Objekt proxy lze použít bez ohledu na jakékoli subdivisions v rámci AppDomain. Aplikace nemusí rozlišovat mezi odkazy na proxy server a odkazy na objekty. Poskytovatelé služeb, kteří se zabývají problémy, jako je aktivace, správa životnosti a transakce, ale musí takové rozdíly rozlišovat.
Tato třída vytváří poptávku propojení a požadavek dědičnosti na úrovni třídy. Vyvolá SecurityException se, když buď bezprostřední volající, nebo odvozená třída nemá oprávnění infrastruktury.
Konstruktory
| Name | Description |
|---|---|
| ObjRef() |
Inicializuje novou instanci ObjRef třídy s výchozími hodnotami. |
| ObjRef(MarshalByRefObject, Type) |
Inicializuje novou instanci ObjRef třídy odkazovat zadaný MarshalByRefObject zadaný Type. |
| ObjRef(SerializationInfo, StreamingContext) |
Inicializuje novou instanci ObjRef třídy ze serializovaných dat. |
Vlastnosti
| Name | Description |
|---|---|
| ChannelInfo |
Získá nebo nastaví IChannelInfo pro ObjRef. |
| EnvoyInfo |
Získá nebo nastaví IEnvoyInfo pro ObjRef. |
| TypeInfo |
Získá nebo nastaví IRemotingTypeInfo pro objekt, který ObjRef popisuje. |
| URI |
Získá nebo nastaví identifikátor URI konkrétní instance objektu. |
Metody
| Name | Description |
|---|---|
| Equals(Object) |
Určuje, zda je zadaný objekt roven aktuálnímu objektu. (Zděděno od Object) |
| GetHashCode() |
Slouží jako výchozí funkce hash. (Zděděno od Object) |
| GetObjectData(SerializationInfo, StreamingContext) |
Naplní zadanou SerializationInfo daty potřebnými k serializaci aktuální ObjRef instance. |
| GetRealObject(StreamingContext) |
Vrátí odkaz na vzdálený objekt, který ObjRef popisuje. |
| GetType() |
Získá Type aktuální instance. (Zděděno od Object) |
| IsFromThisAppDomain() |
Vrátí logickou hodnotu, která určuje, zda aktuální ObjRef instance odkazuje na objekt umístěný v aktuální AppDomain. |
| IsFromThisProcess() |
Vrátí logickou hodnotu, která určuje, zda aktuální ObjRef instance odkazuje na objekt umístěný v aktuálním procesu. |
| MemberwiseClone() |
Vytvoří mělkou kopii aktuálního Object. (Zděděno od Object) |
| ToString() |
Vrátí řetězec, který představuje aktuální objekt. (Zděděno od Object) |