所以我现在正在学习MSIL来学习debugging我的C#.NET应用程序。 我一直在想: 堆栈的目的是什么? 只是把我的问题的背景: 为什么有从内存转移到堆栈或“加载”? 另一方面,为什么有从堆栈转移到内存或“存储”? 为什么不把它们都放在内存中? 是因为它快吗? 是因为它是基于RAM的吗? 为了效率? 我正在努力把握这一点,以帮助我更深入地理解CIL代码。
出于好奇,我试图用C#生成一个尾调用操作码。 斐波纳契是一个很容易的,所以我的c#例子看起来像这样: private static void Main(string[] args) { Console.WriteLine(Fib(int.MaxValue, 0)); } public static int Fib(int i, int acc) { if (i == 0) { return acc; } return Fib(i – 1, acc + i); } 如果我在发行版中构build它,并且在不进行debugging的情况下运行,我不会发生堆栈溢出。 debugging或运行它没有优化,我确实得到一个堆栈溢出,这意味着在优化(这是我所期望的)发布时,尾部调用正在工作。 这个MSIL看起来像这样: .method public hidebysig static int32 Fib(int32 i, int32 acc) cil managed { // Method Start RVA 0x205e […]
我正在寻找一个反编译器或更好的反编译.net。 情况是,我的前任写的汇编源代码丢失了,我想看看它在做什么。 我知道,ildasm随Visual Studio安装,所以我可以在MSIL,但我希望有一个聪明的程序,足以回到C#代码(或最佳近似)。 那里有没有任何工具? (如果不是的话,我想坐下来开始学习MSIL是个很好的借口)
beforefieldinit标志是做什么的? 当我看着我的class级的IL,我看到这个标志,但我不知道这个标志实际上是做什么?
我想要做的是改变一个C#方法在被调用的时候的执行方式,这样我可以写下如下的东西: [Distributed] public DTask<bool> Solve(int n, DEvent<bool> callback) { for (int m = 2; m < n – 1; m += 1) if (m % n == 0) return false; return true; } 在运行时,我需要能够分析具有分布式属性(我已经可以做到)的方法,然后在函数正文执行之前和函数返回之前插入代码。 更重要的是,我需要能够在不调整Solve的地方修改代码,或者在函数启动的时候(编译时;在运行时这样做)。 目前我已经尝试了这一小段代码(假设t是Solve存储的types,m是Solve的MethodInfo) : private void WrapMethod(Type t, MethodInfo m) { // Generate ILasm for delegate. byte[] il = typeof(Dpm).GetMethod("ReplacedSolve").GetMethodBody().GetILAsByteArray(); // Pin […]