我在Reflection C#工作。
我的要求是使用反射调用指定的方法,获取以下内容 调用方法后调用方法的东西。
提前致谢。
答案 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程序的崩溃转储。它允许您为应用程序编写自动崩溃分析,并自动执行许多常见的调试任务。
也可以在正常工作期间附加到自我处理并进行分析,因此可能可以获得有关仪器的一些信息。但正如我所说 - 这将是魔术。我相信你根本不需要这样做。