gpt4 book ai didi

c# - 如何使用 ILGenerator 使用 VarArgs 生成对基本构造函数的调用

转载 作者:行者123 更新时间:2023-11-30 14:30:16 26 4
gpt4 key购买 nike

如果我反编译 Test2 构造函数:

public class Test2 : VarArgTest
{
public Test2() : base("foo", __arglist("one", 2))
{

}
}

public class VarArgTest
{
public VarArgTest(string test, __arglist)
{

}
}

我得到这个 IL:

IL_0000:  ldarg.0
IL_0001: ldstr "foo"
IL_0006: ldstr "one"
IL_000b: ldc.i4.2
IL_000c: call instance vararg void VarargsTest.VarArgTest::.ctor(string,
...,
string,
int32)

我正在尝试使用 ILGenerator 生成相同的 IL 流,但是 EmitCall只接受 MethodInfo 而不是 ConstructorInfo 并且唯一的 Emit采用 ConstructorInfo 的重载不支持传入其他参数类型。

最佳答案

好的,看完这篇post

我发现了一种非常简单的方法:您可以从方法构建器中获取带有可选参数的构造函数的标记。为什么这如此令人难以置信地没有记录是一个谜。下面是我之前回答中的一个类似版本的程序,它做同样的事情,但只使用这个 get methodtoken api。这要容易得多!

var ab = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("Foo"), AssemblyBuilderAccess.RunAndSave);
var mb = ab.DefineDynamicModule(ab.GetName().Name, ab.GetName().Name + ".dll", true);
var tb = mb.DefineType("Foo", TypeAttributes.BeforeFieldInit | TypeAttributes.AnsiClass | TypeAttributes.Class | TypeAttributes.AutoClass | TypeAttributes.Public, typeof(VarArgTest));
var ctor = tb.DefineConstructor(MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName, CallingConventions.HasThis, Type.EmptyTypes);
var il = ctor.GetILGenerator();
var token= mb.GetConstructorToken(typeof(VarArgTest).GetConstructors()[0], new[] { typeof(string), typeof(int) });
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldstr, "foo");
il.Emit(OpCodes.Ldstr, "one");
il.Emit(OpCodes.Ldc_I4_2);
il.Emit(OpCodes.Call,token.Token);
il.Emit(OpCodes.Ret);
var v = Activator.CreateInstance(tb.CreateType());
Console.WriteLine((v as VarArgTest).CountOfArgs);

关于c# - 如何使用 ILGenerator 使用 VarArgs 生成对基本构造函数的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23826139/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com