我之前已经做过,所以我知道可以做到的。(尽管文献记载不多)但忘记了。我一直在搜索2个小时,找不到类似的内容。

我想在调用堆栈上推和拉值,如下所示:

public void Method1()
{
    InsertMagicClassHere.Push("Key", 1);//or something
    Method2();
}

public void Method2()
{
   int value =  InsertMagicClassHere.Pull("Key");//or something
}


我几乎在所有的日志记录方法中都需要此参数。并且不想通过参数传递这3层深度。

最佳答案

您正在寻找Reflection.Emit;但是,这不是它的工作方式。

您实际上不能发出内联操作码。

相反,您可以发出整个方法/类并将其作为“临时”程序集加载。然后,您调用发出的方法。

强制样本:

public void CreateMethod()
{
    AppDomain currentDomain = AppDomain.CurrentDomain;
    AssemblyBuilder asmbuilder = this.GetAssemblyBuilder("MyAssembly");
    ModuleBuilder mbuilder = this.GetModule(asmbuilder);
    TypeBuilder tbuilder = this.GetTypeBuilder(mbuilder, "MyClass");

    Type[] tparams = { typeof(System.Int32), typeof(System.Int32) };
    MethodBuilder methodSum = this.GetMethod(tbuilder, "Sum", typeof(System.Single),
                                                                 tparams);

    ILGenerator generator = methodSum.GetILGenerator();

    generator.DeclareLocal(typeof(System.Single));
    generator.Emit(OpCodes.Ldarg_1);
    generator.Emit(OpCodes.Ldarg_2);
    generator.Emit(OpCodes.Add_Ovf);
    generator.Emit(OpCodes.Conv_R4);
    generator.Emit(OpCodes.Stloc_0);

    generator.Emit(OpCodes.Ldloc_0);
    generator.Emit(OpCodes.Ret);
}


那你能做什么


采取现有方法
拆开它
编写代码以在IL级别上发出新方法(使用Reflection.Emit)
加载发射的程序集
调用您的代码。


请参阅以下文章以获得良好的入门:


http://www.codeproject.com/KB/cs/DLR.aspx
MSDN:using Reflection Emit

关于c# - 在Callstack .net上插入和拉出值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8040539/

10-11 11:17