Files
Dec2017-Script-Dump/mscorlib/System/DelegateSerializationHolder.cs
2026-06-04 11:42:34 +02:00

153 lines
4.5 KiB
C#

using System;
using System.Reflection;
using System.Runtime.Remoting;
using System.Runtime.Serialization;
namespace System
{
// Token: 0x0200065A RID: 1626
[Serializable]
internal class DelegateSerializationHolder : ISerializable, IObjectReference
{
// Token: 0x06003DFE RID: 15870 RVA: 0x000D2F44 File Offset: 0x000D1144
private DelegateSerializationHolder(SerializationInfo info, StreamingContext ctx)
{
DelegateSerializationHolder.DelegateEntry delegateEntry = (DelegateSerializationHolder.DelegateEntry)info.GetValue("Delegate", typeof(DelegateSerializationHolder.DelegateEntry));
int num = 0;
DelegateSerializationHolder.DelegateEntry delegateEntry2 = delegateEntry;
while (delegateEntry2 != null)
{
delegateEntry2 = delegateEntry2.delegateEntry;
num++;
}
if (num == 1)
{
this._delegate = delegateEntry.DeserializeDelegate(info);
}
else
{
Delegate[] array = new Delegate[num];
delegateEntry2 = delegateEntry;
for (int i = 0; i < num; i++)
{
array[i] = delegateEntry2.DeserializeDelegate(info);
delegateEntry2 = delegateEntry2.delegateEntry;
}
this._delegate = Delegate.Combine(array);
}
}
// Token: 0x06003DFF RID: 15871 RVA: 0x000D2FE4 File Offset: 0x000D11E4
public static void GetDelegateData(Delegate instance, SerializationInfo info, StreamingContext ctx)
{
Delegate[] invocationList = instance.GetInvocationList();
DelegateSerializationHolder.DelegateEntry delegateEntry = null;
for (int i = 0; i < invocationList.Length; i++)
{
Delegate @delegate = invocationList[i];
string text = ((@delegate.Target == null) ? null : ("target" + i));
DelegateSerializationHolder.DelegateEntry delegateEntry2 = new DelegateSerializationHolder.DelegateEntry(@delegate, text);
if (delegateEntry == null)
{
info.AddValue("Delegate", delegateEntry2);
}
else
{
delegateEntry.delegateEntry = delegateEntry2;
}
delegateEntry = delegateEntry2;
if (@delegate.Target != null)
{
info.AddValue(text, @delegate.Target);
}
}
info.SetType(typeof(DelegateSerializationHolder));
}
// Token: 0x06003E00 RID: 15872 RVA: 0x000D308C File Offset: 0x000D128C
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
throw new NotSupportedException();
}
// Token: 0x06003E01 RID: 15873 RVA: 0x000D3094 File Offset: 0x000D1294
public object GetRealObject(StreamingContext context)
{
return this._delegate;
}
// Token: 0x040018C4 RID: 6340
private Delegate _delegate;
// Token: 0x0200065B RID: 1627
[Serializable]
private class DelegateEntry
{
// Token: 0x06003E02 RID: 15874 RVA: 0x000D309C File Offset: 0x000D129C
public DelegateEntry(Delegate del, string targetLabel)
{
this.type = del.GetType().FullName;
this.assembly = del.GetType().Assembly.FullName;
this.target = targetLabel;
this.targetTypeAssembly = del.Method.DeclaringType.Assembly.FullName;
this.targetTypeName = del.Method.DeclaringType.FullName;
this.methodName = del.Method.Name;
}
// Token: 0x06003E03 RID: 15875 RVA: 0x000D3120 File Offset: 0x000D1320
public Delegate DeserializeDelegate(SerializationInfo info)
{
object obj = null;
if (this.target != null)
{
obj = info.GetValue(this.target.ToString(), typeof(object));
}
Assembly assembly = Assembly.Load(this.assembly);
Type type = assembly.GetType(this.type);
Delegate @delegate;
if (obj != null)
{
if (RemotingServices.IsTransparentProxy(obj))
{
Assembly assembly2 = Assembly.Load(this.targetTypeAssembly);
Type type2 = assembly2.GetType(this.targetTypeName);
if (!type2.IsInstanceOfType(obj))
{
throw new RemotingException("Unexpected proxy type.");
}
}
@delegate = Delegate.CreateDelegate(type, obj, this.methodName);
}
else
{
Assembly assembly3 = Assembly.Load(this.targetTypeAssembly);
Type type3 = assembly3.GetType(this.targetTypeName);
@delegate = Delegate.CreateDelegate(type, type3, this.methodName);
}
return @delegate;
}
// Token: 0x040018C5 RID: 6341
private string type;
// Token: 0x040018C6 RID: 6342
private string assembly;
// Token: 0x040018C7 RID: 6343
public object target;
// Token: 0x040018C8 RID: 6344
private string targetTypeAssembly;
// Token: 0x040018C9 RID: 6345
private string targetTypeName;
// Token: 0x040018CA RID: 6346
private string methodName;
// Token: 0x040018CB RID: 6347
public DelegateSerializationHolder.DelegateEntry delegateEntry;
}
}
}