// [Serializable] 标记在类上方,我的这串代码就可以使用了
using System;
using System.IO;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.Serialization.Formatters.Binary;
static class Program
{
[Serializable]
public class Demo
{
}
[STAThread]
static void Main()
{
var _this = new Demo();
var _obj = demo.Clone();
}
public static object Clone(this object obj)
{
var Dyn = new DynamicMethod("Clone", typeof(object), new Type[] { typeof(object) });
var MDIL = Dyn.GetILGenerator();
var NULL = new Type[] { };
var IL_0033 = MDIL.DefineLabel();
var IL_DE84 = MDIL.DeclareLocal(typeof(MemoryStream));
var Il_FA10 = MDIL.DeclareLocal(typeof(BinaryFormatter));
var Il_BCC2 = MDIL.DeclareLocal(typeof(Object));
var IL_CS10 = MDIL.DeclareLocal(typeof(Object));
MDIL.Emit(OpCodes.Newobj, typeof(MemoryStream).GetConstructor(NULL));
MDIL.Emit(OpCodes.Stloc_0);
MDIL.Emit(OpCodes.Newobj, typeof(BinaryFormatter).GetConstructor(NULL));
MDIL.Emit(OpCodes.Stloc_1);
MDIL.Emit(OpCodes.Ldloc_1);
MDIL.Emit(OpCodes.Ldloc_0);
MDIL.Emit(OpCodes.Ldarg_0);
MDIL.Emit(OpCodes.Callvirt, typeof(BinaryFormatter).GetMethod("Serialize", new Type[] { typeof(MemoryStream), typeof(Object) }));
MDIL.Emit(OpCodes.Ldloc_0);
MDIL.Emit(OpCodes.Ldc_I4_0);
MDIL.Emit(OpCodes.Conv_I8);
MDIL.Emit(OpCodes.Ldc_I4_0);
MDIL.Emit(OpCodes.Callvirt, typeof(MemoryStream).GetMethod("Seek", new Type[] { typeof(Int64), typeof(SeekOrigin) }));
MDIL.Emit(OpCodes.Pop);
MDIL.Emit(OpCodes.Ldloc_1);
MDIL.Emit(OpCodes.Ldloc_0);
MDIL.Emit(OpCodes.Callvirt, typeof(BinaryFormatter).GetMethod("Deserialize", new Type[] { typeof(MemoryStream) }));
MDIL.Emit(OpCodes.Stloc_2);
MDIL.Emit(OpCodes.Ldloc_0);
MDIL.Emit(OpCodes.Callvirt, typeof(MemoryStream).GetMethod("Close", NULL));
MDIL.Emit(OpCodes.Ldloc_2);
MDIL.Emit(OpCodes.Stloc_3);
MDIL.Emit(OpCodes.Br_S, IL_0033);
MDIL.MarkLabel(IL_0033);
MDIL.Emit(OpCodes.Ldloc_3);
MDIL.Emit(OpCodes.Ret);
try { return Dyn.Invoke(Dyn, new object[] { obj }); }
catch (Exception) { return null; }
}
}