153 lines
4.5 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|