我之前已经做过,所以我知道可以做到的。(尽管文献记载不多)但忘记了。我一直在搜索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/