IMessage 接口
包含在合作的消息接收器之间发送的通讯数据。
**命名空间:**System.Runtime.Remoting.Messaging
**程序集:**mscorlib(在 mscorlib.dll 中)
语法
声明
<ComVisibleAttribute(True)> _
Public Interface IMessage
用法
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
备注
使用 IMessage 的消息接收器可以放置在客户端接收器链或服务器接收器链中。消息对象通过该链在消息接收器之间传递,并携带一组命名属性(如操作标识符、代表信息和参数)。
实现 IMessage 接口的对象满足被视为消息对象的最低限定。不必将一个消息接收器所收到的对象原样传递到下一个接收器,但通常情况是这样。
虽然属性包中的对象不必是可序列化的,但消息接收器实施者需要考虑此因素,原因是流出应用程序域的属性必须是可序列化的。
示例
' 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
平台
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 并不是对每个平台的所有版本都提供支持。有关受支持版本的列表,请参见系统要求。
版本信息
.NET Framework
受以下版本支持:2.0、1.1、1.0