neu IL ... versuchen IL zu schaffen für:anlegen/zuordnen Objekt über C# EMIT IL
Dest CreateInstance(Source src)
{
Dest d = new Dest();
d.Test = src.Test;
return d;
}
Dies ist, was ich bisher:
ConstructorInfo ctor = typeof(Dest).GetConstructors()[0];
DynamicMethod method = new DynamicMethod("CreateIntance", typeof(Dest),
new Type[] { typeof(Source) });
ILGenerator gen = method.GetILGenerator();
//gen.Emit(OpCodes.Ldarg_0);// source
gen.Emit(OpCodes.Newobj, ctor);// new Created
gen.Emit(OpCodes.Ret);
CreateCtor createdCtorDelegate;
createdCtorDelegate = (CreateCtor)method.CreateDelegate(typeof(CreateCtor));
dies, wie oben ausgeführt wird. .. aber wenn ich den Ldarg_0 auskommentiere, bekomme ich eine "diese Operation kann die Laufzeit instabilisieren", wenn ich versuche, den Delegierten anzurufen.
Auch, was brauche ich, um das Testmitglied zu kopieren? angenommen, es ist ein Grundtypus.
Danke!
EDIT:
Quelle und Dest und nur einfache POCOs.
public class Source
{
public string S1 { get; set; }
public string S2 { get; set; }
public int I1 { get; set; }
public int I2 { get; set; }
public string S3 { get; set; }
public string S4 { get; set; }
public string S5 { get; set; }
}
public class Dest
{
public string S1 { get; set; }
public string S2 { get; set; }
public int I1 { get; set; }
public int I2 { get; set; }
public string S3 { get; set; }
public string S4 { get; set; }
public string S5 { get; set; }
}
EDIT # 2: Jetzt habe ich das ... immer noch die destabalize Fehler:
ConstructorInfo ctor = typeof(Dest).GetConstructors()[0];
DynamicMethod method = new DynamicMethod("CreateIntance", typeof(Dest),
new Type[] { typeof(Source) });
MethodInfo miSrc = tSource.GetProperty("S1").GetGetMethod();
MethodInfo miDest = tDest.GetProperty("S1").GetSetMethod();
ILGenerator gen = method.GetILGenerator();
gen.Emit(OpCodes.Newobj, ctor);// new Created
gen.Emit(OpCodes.Dup);
gen.Emit(OpCodes.Ldarg_1);// source
gen.Emit(OpCodes.Ldfld, miSrc);
gen.Emit(OpCodes.Stfld, miDest);
gen.Emit(OpCodes.Ret);
CreateCtor createdCtorDelegate;
createdCtorDelegate = (CreateCtor)method.CreateDelegate(typeof(CreateCtor));
Dest dd = createdCtorDelegate(s);
die Ausnahme, wenn ich die createdCtorDelegate nennen.
EDIT3:
ILSpy zeigt dies:
.method public hidebysig static
class ConsoleApplication3.Dest Test (
class ConsoleApplication3.Source s
) cil managed
{
// Method begins at RVA 0x2148
// Code size 26 (0x1a)
.maxstack 2
.locals init (
[0] class ConsoleApplication3.Dest,
[1] class ConsoleApplication3.Dest
)
IL_0000: nop
IL_0001: newobj instance void ConsoleApplication3.Dest::.ctor()
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: ldarg.0
IL_0009: callvirt instance string ConsoleApplication3.Source::get_S1()
IL_000e: callvirt instance void ConsoleApplication3.Dest::set_S1(string)
IL_0013: nop
IL_0014: ldloc.0
IL_0015: stloc.1
IL_0016: br.s IL_0018
IL_0018: ldloc.1
IL_0019: ret
} // end of method Program::Test
Also, ich habe meinen Code eingestellt:
ConstructorInfo ctor = typeof(Dest).GetConstructors()[0];
DynamicMethod method = new DynamicMethod("CreateIntance", typeof(Dest),
new Type[] { typeof(Source) });
MethodInfo miSrc = tSource.GetProperty("S1").GetGetMethod();
MethodInfo miDest = tDest.GetProperty("S1").GetSetMethod();
ILGenerator gen = method.GetILGenerator();
gen.Emit(OpCodes.Newobj, ctor);// new Created
gen.Emit(OpCodes.Stloc_0);
gen.Emit(OpCodes.Ldloc_0);
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Callvirt, miSrc);
gen.Emit(OpCodes.Callvirt, miDest);
gen.Emit(OpCodes.Ldloc_0);
gen.Emit(OpCodes.Stloc_1);
gen.Emit(OpCodes.Ldloc_1);
gen.Emit(OpCodes.Ret);
CreateCtor createdCtorDelegate;
createdCtorDelegate = (CreateCtor)method.CreateDelegate(typeof(CreateCtor));
Noch Absturz: (...
Können Sie "Basistyp" angeben? Meinst du primitiven Typ oder Struktur oder ...? – thehennyy
Sind Sie sich bewusst, dass die Reflexion emittiert fast obsolet ist angesichts der Tatsache, dass Ausdruck Bäume existieren? – usr
Protip: Dump Sie IL in eine Datei und führen Sie PEVerify darauf aus. – leppie