如何使用Reflection C#获取调用方法的每一行指令

时间:2014-07-04 11:33:11

标签: c# reflection .net-assembly

我在Reflection C#工作。

我的要求是使用反射调用指定的方法,获取以下内容 调用方法后调用方法的东西。

  1. 评论专栏
  2. 执行方法指令
  3. 提前致谢。

2 个答案:

答案 0 :(得分:1)

你所要求的是不可能的,因为反射不是可以反编译你的集会的圣杯。

它是用.NET(Vb,C#,...)编写的程序或编译成IL或中间语言的程序。

那么,中级语言是什么?

中间语言(IL)是一种面向对象的编程语言,旨在供.NET Framework的编译器在静态或动态编译到机器代码之前使用。 .NET Framework使用IL生成与机器无关的代码,作为用任何.NET编程语言编写的源代码编译的输出。

IL是一种基于堆栈的汇编语言,在执行虚拟机时会转换为字节码。它由公共语言基础结构(CLI)规范定义。由于IL用于自动生成编译代码,因此无需了解其语法。

此术语也称为Microsoft中间语言(MSIL)或通用中间语言(CIL)。

<强> 实施例

让我们来看看以下迷你应用程序:

using System;

namespace ConsoleApplication1
{
    // Start class.
    class Program
    {
        // Main entry point.
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");
        }
   }

}

当您现在使用诸如Telerik JustDecompile之类的文件时,您可以查看该应用程序的源代码:

使用System;

namespace ConsoleApplication1
{
    internal class Program
    {
        public Program()
        {
        }

        private static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");
        }
    }
}

您会注意到反编译器生成的代码实际上与您原来的代码不同,但它的技术相同。

但是添加了一个公共构造函数(即使你不在类中添加一个,编译器也会添加一个默认构造函数)。 评论消失了。

现在,这是为什么?这是因为编译后的exe文件不包含你的代码,只是包含你的代码翻译成IL而它是反编译器将转换回C#的IL。

那么,IL怎么样?

.class private auto ansi beforefieldinit ConsoleApplication1.Program
    extends [mscorlib]System.Object
{
    .method public hidebysig specialname rtspecialname instance void .ctor () cil  managed 
    {
        IL_0000: ldarg.0
        IL_0001: call instance void [mscorlib]System.Object::.ctor()
        IL_0006: ret
    }

    .method private hidebysig static void Main (
            string[] args
        ) cil managed 
    {
        .entrypoint
        IL_0000: nop
        IL_0001: ldstr "Hello, World!"
        IL_0006: call void [mscorlib]System.Console::WriteLine(string)
        IL_000b: nop
        IL_000c: ret
    }
}

你知道这已经是一种更接近机器语言的东西了。

所以,我希望这能说清楚为什么你不能通过反思得到你的源代码。

答案 1 :(得分:0)

这是不可能的。反射不是关于检测,而是关于描述类型,方法等的元数据。您也不能从中获取注释,因为它们不包含在已编译的程序集中。

事实上,如果不是非常神奇,就像使用Microsoft.Diagnostics.Runtime一样,对运行程序集的深入了解是不可能的:

  

ClrMD是一组高级API,用于以与SOS调试扩展(SOS)相同的方式以编程方式检查.NET程序的崩溃转储。它允许您为应用程序编写自动崩溃分析,并自动执行许多常见的调试任务。

也可以在正常工作期间附加到自我处理并进行分析,因此可能可以获得有关仪器的一些信息。但正如我所说 - 这将是魔术。我相信你根本不需要这样做。