RealProxy-Klasse
Stellt die Basisfunktionen für Proxys bereit.
Namespace: System.Runtime.Remoting.Proxies
Assembly: mscorlib (in mscorlib.dll)
Syntax
'Declaration
<ComVisibleAttribute(True)> _
Public MustInherit Class RealProxy
'Usage
Dim instance As RealProxy
[ComVisibleAttribute(true)]
public abstract class RealProxy
[ComVisibleAttribute(true)]
public ref class RealProxy abstract
/** @attribute ComVisibleAttribute(true) */
public abstract class RealProxy
ComVisibleAttribute(true)
public abstract class RealProxy
Hinweise
Die RealProxy-Klasse ist die abstract-Basisklasse, von der Proxys abgeleitet werden müssen.
Ein Client, der ein Objekt über jede Art von Remotegrenzen hinweg verwendet, verwendet eigentlich einen transparenten Proxy für dieses Objekt. Der transparente Proxy erweckt den Anschein, dass sich das eigentliche Objekt auf dem Client befindet. Dies wird dadurch erreicht, dass der Proxy an ihn gerichtete Aufrufe über die Remotinginfrastruktur an das eigentliche Objekt weiterleitet.
Der transparente Proxy selbst befindet sich in einer Instanz einer verwalteten Laufzeitklasse vom Typ RealProxy. Der RealProxy implementiert einen Teil der Funktionen, die zum Weiterleiten der Vorgänge vom transparenten Proxy erforderlich sind. Beachten Sie, dass Proxyobjekte die Unterstützung für Felder und Methoden sowie die zugeordnete Semantik verwalteter Objekte, z. B. der Garbage Collection, erben. Sie können außerdem erweitert werden, um neue Klassen zu bilden. Der Proxy ist von dualer Natur: Er verhält sich wie ein Objekt der Klasse des Remoteobjekts (transparenter Proxy), und er ist selbst ein verwaltetes Objekt.
Ein Proxyobjekt kann ohne Berücksichtigung der Remoteuntereinheiten in einer AppDomain verwendet werden.
Hinweis
Diese Klasse führt einen Verknüpfungsaufruf und eine Vererbungsforderung auf der Klassenebene aus. Wenn der direkte Aufrufer bzw. die abgeleitete Klasse nicht über die Berechtigung für die Infrastruktur verfügen, wird eine SecurityException ausgelöst. Ausführliche Informationen über Sicherheitsanforderungen finden Sie unter Verknüpfungsaufrufe und Vererbungsforderungen.
Hinweise für Erben Wenn RealProxy vererbt wird, müssen Sie die Invoke-Methode überschreiben.
Beispiel
' Create a custom 'RealProxy'.
Public Class MyProxy
Inherits RealProxy
Private myURIString As String
Private myMarshalByRefObject As MarshalByRefObject
<PermissionSet(SecurityAction.LinkDemand)> _
Public Sub New(ByVal myType As Type)
MyBase.New(myType)
' RealProxy uses the Type to generate a transparent proxy.
myMarshalByRefObject = CType(Activator.CreateInstance(myType), MarshalByRefObject)
' Get 'ObjRef', for transmission serialization between application domains.
Dim myObjRef As ObjRef = RemotingServices.Marshal(myMarshalByRefObject)
' Get the 'URI' property of 'ObjRef' and store it.
myURIString = myObjRef.URI
Console.WriteLine("URI :{0}", myObjRef.URI)
End Sub 'New
<SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags:=SecurityPermissionFlag.Infrastructure)> _
Public Overrides Function Invoke(ByVal myIMessage As IMessage) As IMessage
Console.WriteLine("MyProxy.Invoke Start")
Console.WriteLine("")
If TypeOf myIMessage Is IMethodCallMessage Then
Console.WriteLine("IMethodCallMessage")
End If
If TypeOf myIMessage Is IMethodReturnMessage Then
Console.WriteLine("IMethodReturnMessage")
End If
Dim msgType As Type
msgType = CObj(myIMessage).GetType
Console.WriteLine("Message Type: {0}", msgType.ToString())
Console.WriteLine("Message Properties")
Dim myIDictionary As IDictionary = myIMessage.Properties
' Set the '__Uri' property of 'IMessage' to 'URI' property of 'ObjRef'.
myIDictionary("__Uri") = myURIString
Dim myIDictionaryEnumerator As IDictionaryEnumerator = CType(myIDictionary.GetEnumerator(), _
IDictionaryEnumerator)
While myIDictionaryEnumerator.MoveNext()
Dim myKey As Object = myIDictionaryEnumerator.Key
Dim myKeyName As String = myKey.ToString()
Dim myValue As Object = myIDictionaryEnumerator.Value
Console.WriteLine(ControlChars.Tab + "{0} : {1}", myKeyName, myIDictionaryEnumerator.Value)
If myKeyName = "__Args" Then
Dim myObjectArray As Object() = CType(myValue, Object())
Dim aIndex As Integer
For aIndex = 0 To myObjectArray.Length - 1
Console.WriteLine(ControlChars.Tab + ControlChars.Tab + "arg: {0} myValue: {1}", _
aIndex, myObjectArray(aIndex))
Next aIndex
End If
If myKeyName = "__MethodSignature" And Not Nothing Is myValue Then
Dim myObjectArray As Object() = CType(myValue, Object())
Dim aIndex As Integer
For aIndex = 0 To myObjectArray.Length - 1
Console.WriteLine(ControlChars.Tab + ControlChars.Tab + "arg: {0} myValue: {1}", _
aIndex, myObjectArray(aIndex))
Next aIndex
End If
End While
Dim myReturnMessage As IMessage
myIDictionary("__Uri") = myURIString
Console.WriteLine("__Uri {0}", myIDictionary("__Uri"))
Console.WriteLine("ChannelServices.SyncDispatchMessage")
myReturnMessage = ChannelServices.SyncDispatchMessage(CObj(myIMessage))
' Push return value and OUT parameters back onto stack.
Dim myMethodReturnMessage As IMethodReturnMessage = CType(myReturnMessage, IMethodReturnMessage)
Console.WriteLine("IMethodReturnMessage.ReturnValue: {0}", myMethodReturnMessage.ReturnValue)
Console.WriteLine("MyProxy.Invoke - Finish")
Return myReturnMessage
End Function 'Invoke
End Class 'MyProxy
// Create a custom 'RealProxy'.
public class MyProxy : RealProxy
{
String myURIString;
MarshalByRefObject myMarshalByRefObject;
[PermissionSet(SecurityAction.LinkDemand)]
public MyProxy(Type myType) : base(myType)
{
// RealProxy uses the Type to generate a transparent proxy.
myMarshalByRefObject = (MarshalByRefObject)Activator.CreateInstance((myType));
// Get 'ObjRef', for transmission serialization between application domains.
ObjRef myObjRef = RemotingServices.Marshal(myMarshalByRefObject);
// Get the 'URI' property of 'ObjRef' and store it.
myURIString = myObjRef.URI;
Console.WriteLine("URI :{0}", myObjRef.URI);
}
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.Infrastructure)]
public override IMessage Invoke(IMessage myIMessage)
{
Console.WriteLine("MyProxy.Invoke Start");
Console.WriteLine("");
if (myIMessage is IMethodCallMessage)
Console.WriteLine("IMethodCallMessage");
if (myIMessage is IMethodReturnMessage)
Console.WriteLine("IMethodReturnMessage");
Type msgType = myIMessage.GetType();
Console.WriteLine("Message Type: {0}", msgType.ToString());
Console.WriteLine("Message Properties");
IDictionary myIDictionary = myIMessage.Properties;
// Set the '__Uri' property of 'IMessage' to 'URI' property of 'ObjRef'.
myIDictionary["__Uri"] = myURIString;
IDictionaryEnumerator myIDictionaryEnumerator =
(IDictionaryEnumerator) myIDictionary.GetEnumerator();
while (myIDictionaryEnumerator.MoveNext())
{
Object myKey = myIDictionaryEnumerator.Key;
String myKeyName = myKey.ToString();
Object myValue = myIDictionaryEnumerator.Value;
Console.WriteLine("\t{0} : {1}", myKeyName,
myIDictionaryEnumerator.Value);
if (myKeyName == "__Args")
{
Object[] myObjectArray = (Object[])myValue;
for (int aIndex = 0; aIndex < myObjectArray.Length; aIndex++)
Console.WriteLine("\t\targ: {0} myValue: {1}", aIndex,
myObjectArray[aIndex]);
}
if ((myKeyName == "__MethodSignature") && (null != myValue))
{
Object[] myObjectArray = (Object[])myValue;
for (int aIndex = 0; aIndex < myObjectArray.Length; aIndex++)
Console.WriteLine("\t\targ: {0} myValue: {1}", aIndex,
myObjectArray[aIndex]);
}
}
IMessage myReturnMessage;
myIDictionary["__Uri"] = myURIString;
Console.WriteLine("__Uri {0}", myIDictionary["__Uri"]);
Console.WriteLine("ChannelServices.SyncDispatchMessage");
myReturnMessage = ChannelServices.SyncDispatchMessage(myIMessage);
// Push return value and OUT parameters back onto stack.
IMethodReturnMessage myMethodReturnMessage = (IMethodReturnMessage)
myReturnMessage;
Console.WriteLine("IMethodReturnMessage.ReturnValue: {0}",
myMethodReturnMessage.ReturnValue);
Console.WriteLine("MyProxy.Invoke - Finish");
return myReturnMessage;
}
}
// Create a custom 'RealProxy'.
/** @attribute SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.Infrastructure) */
public class MyProxy extends RealProxy
{
private String myURIString;
private MarshalByRefObject myMarshalByRefObject;
public MyProxy(Type myType)
{
super(myType);
// RealProxy uses the Type to generate a transparent proxy.
myMarshalByRefObject =
(MarshalByRefObject)(Activator.CreateInstance(myType));
// Get 'ObjRef', for transmission serialization between
// application domains.
ObjRef myObjRef = RemotingServices.Marshal(myMarshalByRefObject);
// Get the 'URI' property of 'ObjRef' and store it.
myURIString = myObjRef.get_URI();
Console.WriteLine("URI :{0}", myObjRef.get_URI());
} //MyProxy
public IMessage Invoke(IMessage myIMessage)
{
Console.WriteLine("MyProxy.Invoke Start");
Console.WriteLine("");
if (myIMessage instanceof IMethodCallMessage) {
Console.WriteLine("IMethodCallMessage");
}
if (myIMessage instanceof IMethodReturnMessage) {
Console.WriteLine("IMethodReturnMessage");
}
Type msgType = myIMessage.GetType();
Console.WriteLine("Message Type: {0}", msgType.ToString());
Console.WriteLine("Message Properties");
IDictionary myIDictionary = myIMessage.get_Properties();
// Set the '__Uri' property of 'IMessage' to 'URI' property of 'ObjRef'.
myIDictionary.set_Item("__Uri", myURIString);
IDictionaryEnumerator myIDictionaryEnumerator =
(IDictionaryEnumerator)(myIDictionary.GetEnumerator());
while (myIDictionaryEnumerator.MoveNext()) {
Object myKey = myIDictionaryEnumerator.get_Key();
String myKeyName = myKey.ToString();
Object myValue = myIDictionaryEnumerator.get_Value();
Console.WriteLine("\t{0} : {1}", myKeyName,
myIDictionaryEnumerator.get_Value());
if (myKeyName.Equals("__Args")) {
Object myObjectArray[] = (Object[])myValue;
for (int aIndex = 0; aIndex < myObjectArray.length; aIndex++) {
Console.WriteLine("\t\targ: {0} myValue: {1}",
(Int32)aIndex, myObjectArray.get_Item(aIndex));
}
}
if (myKeyName.Equals("__MethodSignature") && null != myValue) {
Object myObjectArray[] = (Object[])myValue;
for (int aIndex = 0; aIndex < myObjectArray.length; aIndex++) {
Console.WriteLine("\t\targ: {0} myValue: {1}",
(Int32)aIndex, myObjectArray.get_Item(aIndex));
}
}
}
IMessage myReturnMessage;
myIDictionary.set_Item("__Uri", myURIString);
Console.WriteLine("__Uri {0}", myIDictionary.get_Item("__Uri"));
Console.WriteLine("ChannelServices.SyncDispatchMessage");
myReturnMessage = ChannelServices.SyncDispatchMessage(myIMessage);
// Push return value and OUT parameters back onto stack.
IMethodReturnMessage myMethodReturnMessage =
(IMethodReturnMessage)myReturnMessage;
Console.WriteLine("IMethodReturnMessage.ReturnValue: {0}",
myMethodReturnMessage.get_ReturnValue());
Console.WriteLine("MyProxy.Invoke - Finish");
return myReturnMessage;
} //Invoke
} //MyProxy
.NET Framework-Sicherheit
- SecurityPermission für die Verwendung von Infrastrukturcode. Anforderungswert: SecurityAction.LinkDemand; Berechtigungswert: SecurityPermissionFlag.Infrastructure
- SecurityPermission für die Verwendung von Infrastrukturcode. Anforderungswert: SecurityAction.InheritanceDemand; Berechtigungswert: SecurityPermissionFlag.Infrastructure
Vererbungshierarchie
System.Object
System.Runtime.Remoting.Proxies.RealProxy
Threadsicherheit
Alle öffentlichen statischen (Shared in Visual Basic) Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.
Plattformen
Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.
Versionsinformationen
.NET Framework
Unterstützt in: 2.0, 1.1, 1.0