你所要求的是不可能的,因为反射不是可以反编译你的程序集的圣杯。
因此,使用 .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之类的时候,你可以查看应用程序的源代码:
使用系统;
namespace ConsoleApplication1
{
internal class Program
{
public Program()
{
}
private static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
}
您会注意到反编译器生成的代码实际上与您最初的不同,但技术相同。
但是添加了一个公共构造函数(即使您没有在类中添加一个,编译器也会添加一个默认构造函数)。
cmets 不见了。
现在,这是为什么呢?这是因为编译后的 exe 文件不包含您的代码,而只包含您翻译成 IL 的代码,而反编译器会将其翻译回 C#。
那么,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
}
}
你看这已经是更接近机器语言的东西了。
所以,我希望这能说明为什么您无法通过反射获取源代码。