Share via


IMessage-Schnittstelle

Enthält Kommunikationsdaten, die zwischen zusammenwirkenden Meldungsempfängern hin- und hergesendet werden.

Namespace: System.Runtime.Remoting.Messaging
Assembly: mscorlib (in mscorlib.dll)

Syntax

'Declaration
<ComVisibleAttribute(True)> _
Public Interface IMessage
'Usage
Dim instance As IMessage
[ComVisibleAttribute(true)] 
public interface IMessage
[ComVisibleAttribute(true)] 
public interface class IMessage
/** @attribute ComVisibleAttribute(true) */ 
public interface IMessage
ComVisibleAttribute(true) 
public interface IMessage

Hinweise

Meldungssenken, die IMessage verwenden, können in die Clientsenkenketten oder die Serversenkenketten aufgenommen werden. Ein Meldungsobjekt wird von einem Meldungsempfänger an einen anderen in der Kette übergeben und enthält eine Gruppe benannter Eigenschaften, z. B. Aktionsbezeichner, Boteninformationen und Parameter.

Ein Objekt mit einer Implementierung der IMessage-Schnittstelle erfüllt die minimalen Voraussetzungen für ein Meldungsobjekt. Es muss nicht genau das gleiche, von einem Meldungsempfänger empfangene Objekt an den nächsten Empfänger übergeben werden.

Obwohl die Objekte in der Eigenschaftensammlung nicht serialisierbar sein müssen, ist dies dennoch bei der Implementierung der Meldungsempfänger zu berücksichtigen, denn die aus der Anwendungsdomäne weitergeleiteten Eigenschaften sind serialisierbar.

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

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

Siehe auch

Referenz

IMessage-Member
System.Runtime.Remoting.Messaging-Namespace