Files
Dec2017-Script-Dump/mscorlib/System/Runtime/Remoting/Contexts/Context.cs
T
2026-06-04 11:42:34 +02:00

601 lines
23 KiB
C#

using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.Runtime.Remoting.Activation;
using System.Runtime.Remoting.Lifetime;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Proxies;
using System.Threading;
namespace System.Runtime.Remoting.Contexts
{
/// <summary>Defines an environment for the objects that are resident inside it and for which a policy can be enforced.</summary>
// Token: 0x020003B8 RID: 952
[ComVisible(true)]
public class Context
{
/// <summary>Initializes a new instance of the <see cref="T:System.Runtime.Remoting.Contexts.Context" /> class.</summary>
// Token: 0x060025E8 RID: 9704 RVA: 0x0007CF64 File Offset: 0x0007B164
public Context()
{
this.domain_id = Thread.GetDomainID();
this.context_id = 1 + Context.global_count++;
}
/// <summary>Cleans up the backing objects for the nondefault contexts.</summary>
// Token: 0x060025EA RID: 9706 RVA: 0x0007CFA4 File Offset: 0x0007B1A4
~Context()
{
}
/// <summary>Gets the default context for the current application domain.</summary>
/// <returns>The default context for the <see cref="T:System.AppDomain" /> namespace.</returns>
/// <PermissionSet>
/// <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="Infrastructure" />
/// </PermissionSet>
// Token: 0x17000715 RID: 1813
// (get) Token: 0x060025EB RID: 9707 RVA: 0x0007CFDC File Offset: 0x0007B1DC
public static Context DefaultContext
{
get
{
return AppDomain.InternalGetDefaultContext();
}
}
/// <summary>Gets the context ID for the current context.</summary>
/// <returns>The context ID for the current context.</returns>
/// <PermissionSet>
/// <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="Infrastructure" />
/// </PermissionSet>
// Token: 0x17000716 RID: 1814
// (get) Token: 0x060025EC RID: 9708 RVA: 0x0007CFE4 File Offset: 0x0007B1E4
public virtual int ContextID
{
get
{
return this.context_id;
}
}
/// <summary>Gets the array of the current context properties.</summary>
/// <returns>The current context properties array; otherwise, null if the context does not have any properties attributed to it.</returns>
/// <PermissionSet>
/// <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="Infrastructure" />
/// </PermissionSet>
// Token: 0x17000717 RID: 1815
// (get) Token: 0x060025ED RID: 9709 RVA: 0x0007CFEC File Offset: 0x0007B1EC
public virtual IContextProperty[] ContextProperties
{
get
{
if (this.context_properties == null)
{
return new IContextProperty[0];
}
return (IContextProperty[])this.context_properties.ToArray(typeof(IContextProperty[]));
}
}
// Token: 0x17000718 RID: 1816
// (get) Token: 0x060025EE RID: 9710 RVA: 0x0007D028 File Offset: 0x0007B228
internal bool IsDefaultContext
{
get
{
return this.context_id == 0;
}
}
// Token: 0x17000719 RID: 1817
// (get) Token: 0x060025EF RID: 9711 RVA: 0x0007D034 File Offset: 0x0007B234
internal bool NeedsContextSink
{
get
{
return this.context_id != 0 || (Context.global_dynamic_properties != null && Context.global_dynamic_properties.HasProperties) || (this.context_dynamic_properties != null && this.context_dynamic_properties.HasProperties);
}
}
/// <summary>Registers a dynamic property implementing the <see cref="T:System.Runtime.Remoting.Contexts.IDynamicProperty" /> interface with the remoting service.</summary>
/// <returns>true if the property was successfully registered; otherwise, false.</returns>
/// <param name="prop">The dynamic property to register. </param>
/// <param name="obj">The object/proxy for which the <paramref name="property" /> is registered. </param>
/// <param name="ctx">The context for which the <paramref name="property" /> is registered. </param>
/// <exception cref="T:System.ArgumentNullException">Either <paramref name="prop" /> or its name is null, or it is not dynamic (it does not implement <see cref="T:System.Runtime.Remoting.Contexts.IDynamicProperty" />). </exception>
/// <exception cref="T:System.ArgumentException">Both an object as well as a context are specified (both <paramref name="obj" /> and <paramref name="ctx" /> are not null). </exception>
/// <PermissionSet>
/// <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="Infrastructure" />
/// </PermissionSet>
// Token: 0x060025F0 RID: 9712 RVA: 0x0007D084 File Offset: 0x0007B284
public static bool RegisterDynamicProperty(IDynamicProperty prop, ContextBoundObject obj, Context ctx)
{
DynamicPropertyCollection dynamicPropertyCollection = Context.GetDynamicPropertyCollection(obj, ctx);
return dynamicPropertyCollection.RegisterDynamicProperty(prop);
}
/// <summary>Unregisters a dynamic property implementing the <see cref="T:System.Runtime.Remoting.Contexts.IDynamicProperty" /> interface.</summary>
/// <returns>true if the object was successfully unregistered; otherwise, false.</returns>
/// <param name="name">The name of the dynamic property to unregister. </param>
/// <param name="obj">The object/proxy for which the <paramref name="property" /> is registered. </param>
/// <param name="ctx">The context for which the <paramref name="property" /> is registered. </param>
/// <exception cref="T:System.ArgumentNullException">The <paramref name="name" /> parameter is null. </exception>
/// <exception cref="T:System.ArgumentException">Both an object as well as a context are specified (both <paramref name="obj" /> and <paramref name="ctx" /> are not null). </exception>
/// <PermissionSet>
/// <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="Infrastructure" />
/// </PermissionSet>
// Token: 0x060025F1 RID: 9713 RVA: 0x0007D0A0 File Offset: 0x0007B2A0
public static bool UnregisterDynamicProperty(string name, ContextBoundObject obj, Context ctx)
{
DynamicPropertyCollection dynamicPropertyCollection = Context.GetDynamicPropertyCollection(obj, ctx);
return dynamicPropertyCollection.UnregisterDynamicProperty(name);
}
// Token: 0x060025F2 RID: 9714 RVA: 0x0007D0BC File Offset: 0x0007B2BC
private static DynamicPropertyCollection GetDynamicPropertyCollection(ContextBoundObject obj, Context ctx)
{
if (ctx == null && obj != null)
{
if (RemotingServices.IsTransparentProxy(obj))
{
RealProxy realProxy = RemotingServices.GetRealProxy(obj);
return realProxy.ObjectIdentity.ClientDynamicProperties;
}
return obj.ObjectIdentity.ServerDynamicProperties;
}
else
{
if (ctx != null && obj == null)
{
if (ctx.context_dynamic_properties == null)
{
ctx.context_dynamic_properties = new DynamicPropertyCollection();
}
return ctx.context_dynamic_properties;
}
if (ctx == null && obj == null)
{
if (Context.global_dynamic_properties == null)
{
Context.global_dynamic_properties = new DynamicPropertyCollection();
}
return Context.global_dynamic_properties;
}
throw new ArgumentException("Either obj or ctx must be null");
}
}
// Token: 0x060025F3 RID: 9715 RVA: 0x0007D158 File Offset: 0x0007B358
internal static void NotifyGlobalDynamicSinks(bool start, IMessage req_msg, bool client_site, bool async)
{
if (Context.global_dynamic_properties != null && Context.global_dynamic_properties.HasProperties)
{
Context.global_dynamic_properties.NotifyMessage(start, req_msg, client_site, async);
}
}
// Token: 0x1700071A RID: 1818
// (get) Token: 0x060025F4 RID: 9716 RVA: 0x0007D184 File Offset: 0x0007B384
internal static bool HasGlobalDynamicSinks
{
get
{
return Context.global_dynamic_properties != null && Context.global_dynamic_properties.HasProperties;
}
}
// Token: 0x060025F5 RID: 9717 RVA: 0x0007D1A0 File Offset: 0x0007B3A0
internal void NotifyDynamicSinks(bool start, IMessage req_msg, bool client_site, bool async)
{
if (this.context_dynamic_properties != null && this.context_dynamic_properties.HasProperties)
{
this.context_dynamic_properties.NotifyMessage(start, req_msg, client_site, async);
}
}
// Token: 0x1700071B RID: 1819
// (get) Token: 0x060025F6 RID: 9718 RVA: 0x0007D1D0 File Offset: 0x0007B3D0
internal bool HasDynamicSinks
{
get
{
return this.context_dynamic_properties != null && this.context_dynamic_properties.HasProperties;
}
}
// Token: 0x1700071C RID: 1820
// (get) Token: 0x060025F7 RID: 9719 RVA: 0x0007D1EC File Offset: 0x0007B3EC
internal bool HasExitSinks
{
get
{
return !(this.GetClientContextSinkChain() is ClientContextTerminatorSink) || this.HasDynamicSinks || Context.HasGlobalDynamicSinks;
}
}
/// <summary>Returns a specific context property, specified by name.</summary>
/// <returns>The specified context property.</returns>
/// <param name="name">The name of the property. </param>
/// <PermissionSet>
/// <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="Infrastructure" />
/// </PermissionSet>
// Token: 0x060025F8 RID: 9720 RVA: 0x0007D214 File Offset: 0x0007B414
public virtual IContextProperty GetProperty(string name)
{
if (this.context_properties == null)
{
return null;
}
foreach (object obj in this.context_properties)
{
IContextProperty contextProperty = (IContextProperty)obj;
if (contextProperty.Name == name)
{
return contextProperty;
}
}
return null;
}
/// <summary>Sets a specific context property by name.</summary>
/// <param name="prop">The actual context property. </param>
/// <exception cref="T:System.InvalidOperationException">There is an attempt to add properties to the default context. </exception>
/// <exception cref="T:System.InvalidOperationException">The context is frozen. </exception>
/// <exception cref="T:System.ArgumentNullException">The property or the property name is null. </exception>
/// <PermissionSet>
/// <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="Infrastructure" />
/// </PermissionSet>
// Token: 0x060025F9 RID: 9721 RVA: 0x0007D2A4 File Offset: 0x0007B4A4
public virtual void SetProperty(IContextProperty prop)
{
if (prop == null)
{
throw new ArgumentNullException("IContextProperty");
}
if (this == Context.DefaultContext)
{
throw new InvalidOperationException("Can not add properties to default context");
}
if (this.frozen)
{
throw new InvalidOperationException("Context is Frozen");
}
if (this.context_properties == null)
{
this.context_properties = new ArrayList();
}
this.context_properties.Add(prop);
}
/// <summary>Freezes the context, making it impossible to add or remove context properties from the current context.</summary>
/// <exception cref="T:System.InvalidOperationException">The context is already frozen. </exception>
/// <PermissionSet>
/// <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="Infrastructure" />
/// </PermissionSet>
// Token: 0x060025FA RID: 9722 RVA: 0x0007D314 File Offset: 0x0007B514
public virtual void Freeze()
{
if (this.context_properties != null)
{
foreach (object obj in this.context_properties)
{
IContextProperty contextProperty = (IContextProperty)obj;
contextProperty.Freeze(this);
}
}
}
/// <summary>Returns a <see cref="T:System.String" /> class representation of the current context.</summary>
/// <returns>A <see cref="T:System.String" /> class representation of the current context.</returns>
// Token: 0x060025FB RID: 9723 RVA: 0x0007D390 File Offset: 0x0007B590
public override string ToString()
{
return "ContextID: " + this.context_id;
}
// Token: 0x060025FC RID: 9724 RVA: 0x0007D3A8 File Offset: 0x0007B5A8
internal IMessageSink GetServerContextSinkChain()
{
if (this.server_context_sink_chain == null)
{
if (Context.default_server_context_sink == null)
{
Context.default_server_context_sink = new ServerContextTerminatorSink();
}
this.server_context_sink_chain = Context.default_server_context_sink;
if (this.context_properties != null)
{
for (int i = this.context_properties.Count - 1; i >= 0; i--)
{
IContributeServerContextSink contributeServerContextSink = this.context_properties[i] as IContributeServerContextSink;
if (contributeServerContextSink != null)
{
this.server_context_sink_chain = contributeServerContextSink.GetServerContextSink(this.server_context_sink_chain);
}
}
}
}
return this.server_context_sink_chain;
}
// Token: 0x060025FD RID: 9725 RVA: 0x0007D438 File Offset: 0x0007B638
internal IMessageSink GetClientContextSinkChain()
{
if (this.client_context_sink_chain == null)
{
this.client_context_sink_chain = new ClientContextTerminatorSink(this);
if (this.context_properties != null)
{
foreach (object obj in this.context_properties)
{
IContextProperty contextProperty = (IContextProperty)obj;
IContributeClientContextSink contributeClientContextSink = contextProperty as IContributeClientContextSink;
if (contributeClientContextSink != null)
{
this.client_context_sink_chain = contributeClientContextSink.GetClientContextSink(this.client_context_sink_chain);
}
}
}
}
return this.client_context_sink_chain;
}
// Token: 0x060025FE RID: 9726 RVA: 0x0007D4E8 File Offset: 0x0007B6E8
internal IMessageSink CreateServerObjectSinkChain(MarshalByRefObject obj, bool forceInternalExecute)
{
IMessageSink messageSink = new StackBuilderSink(obj, forceInternalExecute);
messageSink = new ServerObjectTerminatorSink(messageSink);
messageSink = new LeaseSink(messageSink);
if (this.context_properties != null)
{
for (int i = this.context_properties.Count - 1; i >= 0; i--)
{
IContextProperty contextProperty = (IContextProperty)this.context_properties[i];
IContributeObjectSink contributeObjectSink = contextProperty as IContributeObjectSink;
if (contributeObjectSink != null)
{
messageSink = contributeObjectSink.GetObjectSink(obj, messageSink);
}
}
}
return messageSink;
}
// Token: 0x060025FF RID: 9727 RVA: 0x0007D560 File Offset: 0x0007B760
internal IMessageSink CreateEnvoySink(MarshalByRefObject serverObject)
{
IMessageSink messageSink = EnvoyTerminatorSink.Instance;
if (this.context_properties != null)
{
foreach (object obj in this.context_properties)
{
IContextProperty contextProperty = (IContextProperty)obj;
IContributeEnvoySink contributeEnvoySink = contextProperty as IContributeEnvoySink;
if (contributeEnvoySink != null)
{
messageSink = contributeEnvoySink.GetEnvoySink(serverObject, messageSink);
}
}
}
return messageSink;
}
// Token: 0x06002600 RID: 9728 RVA: 0x0007D5F4 File Offset: 0x0007B7F4
internal static Context SwitchToContext(Context newContext)
{
return AppDomain.InternalSetContext(newContext);
}
// Token: 0x06002601 RID: 9729 RVA: 0x0007D5FC File Offset: 0x0007B7FC
internal static Context CreateNewContext(IConstructionCallMessage msg)
{
Context context = new Context();
foreach (object obj in msg.ContextProperties)
{
IContextProperty contextProperty = (IContextProperty)obj;
if (context.GetProperty(contextProperty.Name) == null)
{
context.SetProperty(contextProperty);
}
}
context.Freeze();
foreach (object obj2 in msg.ContextProperties)
{
IContextProperty contextProperty2 = (IContextProperty)obj2;
if (!contextProperty2.IsNewContextOK(context))
{
throw new RemotingException("A context property did not approve the candidate context for activating the object");
}
}
return context;
}
/// <summary>Executes code in another context.</summary>
/// <param name="deleg">The delegate used to request the callback. </param>
/// <PermissionSet>
/// <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="Infrastructure" />
/// </PermissionSet>
// Token: 0x06002602 RID: 9730 RVA: 0x0007D704 File Offset: 0x0007B904
public void DoCallBack(CrossContextDelegate deleg)
{
lock (this)
{
if (this.callback_object == null)
{
Context context = Context.SwitchToContext(this);
this.callback_object = new ContextCallbackObject();
Context.SwitchToContext(context);
}
}
this.callback_object.DoCallBack(deleg);
}
/// <summary>Allocates an unnamed data slot.</summary>
/// <returns>A local data slot.</returns>
/// <PermissionSet>
/// <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="Infrastructure" />
/// </PermissionSet>
// Token: 0x06002603 RID: 9731 RVA: 0x0007D774 File Offset: 0x0007B974
public static LocalDataStoreSlot AllocateDataSlot()
{
return new LocalDataStoreSlot(false);
}
/// <summary>Allocates a named data slot.</summary>
/// <returns>A local data slot object.</returns>
/// <param name="name">The required name for the data slot. </param>
/// <PermissionSet>
/// <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="Infrastructure" />
/// </PermissionSet>
// Token: 0x06002604 RID: 9732 RVA: 0x0007D77C File Offset: 0x0007B97C
public static LocalDataStoreSlot AllocateNamedDataSlot(string name)
{
object syncRoot = Context.namedSlots.SyncRoot;
LocalDataStoreSlot localDataStoreSlot2;
lock (syncRoot)
{
LocalDataStoreSlot localDataStoreSlot = Context.AllocateDataSlot();
Context.namedSlots.Add(name, localDataStoreSlot);
localDataStoreSlot2 = localDataStoreSlot;
}
return localDataStoreSlot2;
}
/// <summary>Frees a named data slot on all the contexts.</summary>
/// <param name="name">The name of the data slot to free. </param>
/// <PermissionSet>
/// <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="Infrastructure" />
/// </PermissionSet>
// Token: 0x06002605 RID: 9733 RVA: 0x0007D7DC File Offset: 0x0007B9DC
public static void FreeNamedDataSlot(string name)
{
object syncRoot = Context.namedSlots.SyncRoot;
lock (syncRoot)
{
Context.namedSlots.Remove(name);
}
}
/// <summary>Retrieves the value from the specified slot on the current context.</summary>
/// <returns>Returns the data associated with <paramref name="slot" />. </returns>
/// <param name="slot">The data slot that contains the data. </param>
/// <PermissionSet>
/// <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="Infrastructure" />
/// </PermissionSet>
// Token: 0x06002606 RID: 9734 RVA: 0x0007D830 File Offset: 0x0007BA30
public static object GetData(LocalDataStoreSlot slot)
{
Context currentContext = Thread.CurrentContext;
Context context = currentContext;
object obj;
lock (context)
{
if (currentContext.datastore != null && slot.slot < currentContext.datastore.Length)
{
obj = currentContext.datastore[slot.slot];
}
else
{
obj = null;
}
}
return obj;
}
/// <summary>Looks up a named data slot.</summary>
/// <returns>Returns a local data slot.</returns>
/// <param name="name">The data slot name. </param>
/// <PermissionSet>
/// <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="Infrastructure" />
/// </PermissionSet>
// Token: 0x06002607 RID: 9735 RVA: 0x0007D8AC File Offset: 0x0007BAAC
public static LocalDataStoreSlot GetNamedDataSlot(string name)
{
object syncRoot = Context.namedSlots.SyncRoot;
LocalDataStoreSlot localDataStoreSlot2;
lock (syncRoot)
{
LocalDataStoreSlot localDataStoreSlot = Context.namedSlots[name] as LocalDataStoreSlot;
if (localDataStoreSlot == null)
{
localDataStoreSlot2 = Context.AllocateNamedDataSlot(name);
}
else
{
localDataStoreSlot2 = localDataStoreSlot;
}
}
return localDataStoreSlot2;
}
/// <summary>Sets the data in the specified slot on the current context.</summary>
/// <param name="slot">The data slot where the data is to be added. </param>
/// <param name="data">The data that is to be added. </param>
/// <PermissionSet>
/// <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="Infrastructure" />
/// </PermissionSet>
// Token: 0x06002608 RID: 9736 RVA: 0x0007D920 File Offset: 0x0007BB20
public static void SetData(LocalDataStoreSlot slot, object data)
{
Context currentContext = Thread.CurrentContext;
Context context = currentContext;
lock (context)
{
if (currentContext.datastore == null)
{
currentContext.datastore = new object[slot.slot + 2];
}
else if (slot.slot >= currentContext.datastore.Length)
{
object[] array = new object[slot.slot + 2];
currentContext.datastore.CopyTo(array, 0);
currentContext.datastore = array;
}
currentContext.datastore[slot.slot] = data;
}
}
// Token: 0x04000ECB RID: 3787
private int domain_id;
// Token: 0x04000ECC RID: 3788
private int context_id;
// Token: 0x04000ECD RID: 3789
private UIntPtr static_data;
// Token: 0x04000ECE RID: 3790
private static IMessageSink default_server_context_sink;
// Token: 0x04000ECF RID: 3791
private IMessageSink server_context_sink_chain;
// Token: 0x04000ED0 RID: 3792
private IMessageSink client_context_sink_chain;
// Token: 0x04000ED1 RID: 3793
private object[] datastore;
// Token: 0x04000ED2 RID: 3794
private ArrayList context_properties;
// Token: 0x04000ED3 RID: 3795
private bool frozen;
// Token: 0x04000ED4 RID: 3796
private static int global_count;
// Token: 0x04000ED5 RID: 3797
private static Hashtable namedSlots = new Hashtable();
// Token: 0x04000ED6 RID: 3798
private static DynamicPropertyCollection global_dynamic_properties;
// Token: 0x04000ED7 RID: 3799
private DynamicPropertyCollection context_dynamic_properties;
// Token: 0x04000ED8 RID: 3800
private ContextCallbackObject callback_object;
}
}