This documentation is archived and is not being maintained.

ObjRef Class

Stores all relevant information required to generate a proxy in order to communicate with a remote object.

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

<SerializableAttribute> _
<ComVisibleAttribute(True)> _
<SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags := SecurityPermissionFlag.Infrastructure)> _
<SecurityPermissionAttribute(SecurityAction.InheritanceDemand, Flags := SecurityPermissionFlag.Infrastructure)> _
Public Class ObjRef _
	Implements IObjectReference, ISerializable
Dim instance As ObjRef

A ObjRef is a serializable representation of an object that extends MarshalByRefObject (MBR). A ObjRef is used to transfer an object reference across a AppDomain boundary. Creating a ObjRef for an object is known as marshaling. You can create a ObjRef (marshal a MarshalByRefObject) either explicitly, by registering the MBR object with the remoting infrastructure (see RemotingConfiguration and RemotingServices.Marshal), or implicitly, by passing an MBR object as a parameter when calling a remote object. Remoting uses ObjRef objects to store and transmit all the relevant information about the MarshalByRefObject being remoted.

The ObjRef contains information that describes the Type and class of the object being marshaled, its exact location, and communication-related information on how to reach the remoting subdivision where the object is located.

After a class implementing MarshalByRefObject is marshaled, the ObjRef that represents it is transferred through a channel into another application domain, possibly in another process or computer. When the ObjRef is deserialized (see [<topic://cpconserialization>]) in the target application domain, it is parsed to create a transparent proxy for the remote MBR object. This operation is known as unmarshaling.

A transparent proxy is an object that provides the illusion that the actual object resides in the client's space. It achieves this by forwarding calls made on it to the real object using the remoting infrastructure. The transparent proxy is itself housed by an instance of a managed run-time class of type RealProxy. The RealProxy implements a part of the functionality needed to forward the operations from the transparent proxy.

A proxy object can be used without regard to any remoting subdivisions within a AppDomain. Applications need not distinguish between proxy references and object references. However, service providers dealing with issues such as activation, lifetime management, and transactions need to make such distinctions.

This class makes a link demand and an inheritance demand at the class level. A SecurityException is thrown when either the immediate caller or the derived class does not have infrastructure permission. For details about security demands, see Link Demands and Inheritance Demands.

The following code example demonstrates the use of a custom ObjRef. To view the activation code that tests the custom ObjRef, see the example for the RegisterWellKnownServiceType method.

' 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.")
   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)
      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)
         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 
         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
// a custom ObjRef class that outputs its status
public __gc class MyObjRef : public ObjRef 
	// only instantiate using marshaling or deserialization
	MyObjRef() { }

	MyObjRef(MarshalByRefObject* o, Type* t) : ObjRef(o, t) 
		Console::WriteLine(S"Created MyObjRef.");

	MyObjRef(SerializationInfo* i, StreamingContext c) : ObjRef(i, c) 
		Console::WriteLine(S"Deserialized MyObjRef.");

	void GetObjectData(SerializationInfo* s, StreamingContext c) 
		// After calling the base method, change the type from ObjRef to MyObjRef
		ObjRef::GetObjectData(s, c);
		Console::WriteLine(S"Serialized MyObjRef.");

	Object* GetRealObject(StreamingContext context) 
		if (IsFromThisAppDomain() || IsFromThisProcess()) 
			Console::WriteLine(S"Returning actual Object* referenced by MyObjRef.");
			return ObjRef::GetRealObject(context);
			Console::WriteLine(S"Returning proxy to remote Object*.");
			return RemotingServices::Unmarshal(this);

	void ORDump() 
		Console::WriteLine(S" --- Reporting MyObjRef Info --- ");
		Console::WriteLine(S"Reference to {0}.", TypeInfo->TypeName);
		Console::WriteLine(S"URI is {0}.", URI);
		Console::WriteLine(S"\nWriting EnvoyInfo: ");

		if (EnvoyInfo != 0) 

			IMessageSink* EISinks = EnvoyInfo->EnvoySinks;
			while (EISinks != 0) {

				Console::WriteLine(S"\tSink: {0}", EISinks);  
				EISinks = EISinks->NextSink;
			Console::WriteLine(S"\t {no sinks}");

		Console::WriteLine(S"\nWriting ChannelInfo: ");
		for (int i = 0; i < ChannelInfo->ChannelData->Length; i++)
			Console::WriteLine (S"\tChannel: {0}", ChannelInfo->ChannelData->Item[i]);
		Console::WriteLine(S" ----------------------------- ");

// a class that uses MyObjRef
public __gc class LocalObject : public MarshalByRefObject 
	// overriding CreateObjRef will allow us to return a custom ObjRef
	ObjRef* CreateObjRef(Type* t) 
		return new MyObjRef(this, t);


Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

Windows 7, Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98

The .NET Framework and .NET Compact Framework do not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

.NET Framework

Supported in: 3.5, 3.0, 2.0, 1.1, 1.0