C# 反射如何在机器语言级别上工作

C# 反射如何在机器语言级别上工作,c#,.net,C#,.net,我知道反射是通过“读取元数据”来完成的,但是当它被编译时,它是如何存储的?此外,元数据占用了多少空间?如果反编译器可以从元数据中重新生成我的整个c#程序,那么它存储的元数据是否几乎与编写的代码一样多 我知道反射是通过“读取元数据”来完成的,但是当它是 编译,它是如何存储的?此外,占用了多少空间 从元数据?如果反编译器可以重新生成我的整个c#程序 从元数据来看,它存储的元数据几乎与写入的元数据一样多吗 密码 当编译器编译代码时,它将存储为IL代码。你的代码被保存的想法是不正确的。“反编译器”或反射

我知道反射是通过“读取元数据”来完成的,但是当它被编译时,它是如何存储的?此外,元数据占用了多少空间?如果反编译器可以从元数据中重新生成我的整个c#程序,那么它存储的元数据是否几乎与编写的代码一样多

我知道反射是通过“读取元数据”来完成的,但是当它是 编译,它是如何存储的?此外,占用了多少空间 从元数据?如果反编译器可以重新生成我的整个c#程序 从元数据来看,它存储的元数据几乎与写入的元数据一样多吗 密码


当编译器编译代码时,它将存储为IL代码。你的代码被保存的想法是不正确的。“反编译器”或反射器并不完全完美。他们几乎重新创建了最初编译的内容。如果仔细观察您编写的代码和反映的代码,它们并不完全相同

如果使用ildasm打开程序集,则可以看到元数据。您将看到类列表、应用于类的属性、引用的DLL、方法和签名等。。。您必须阅读.NET可执行文件的.dll格式规范,才能确切了解它占用了多少空间,并且所有这些都以比程序集更紧凑的格式存储在程序集中

然后单击一个方法,您将看到编译成中间语言的代码。您会注意到它与您的源代码完全不同。像freeilspy这样的反编译器无法完全按照您编写的程序重新生成C#程序。生成的IL并不像x86汇编那样低级,但它的级别足够高,反编译器可以做得很好。足够让您了解代码在做什么

还有一些关于堆栈溢出的其他问题涉及到这个主题。

还可以尝试搜索“可移植可执行文件”即PE格式。


我不太确定它的实际存储大小。您必须深入了解格式才能看到。或者尝试编译一些代码,并将代码大小与可执行文件大小进行比较。

NET语言家族生活在一个名为(CLR)的运行时环境中。编译.NET语言(如C)时,您正在将C语言转换为由“中间语言”(IL)及其相关元数据组成的程序集。直到运行时,JIT编译才会发生,并将IL转换为汇编语言代码

反编译器可以通过读取IL并使用规则生成C#或VB.NET或任何您需要的受支持的.NET语言来生成代码。您不会得到原始代码,而是根据IL包含的内容和反编译器完成的映射生成的新代码

只要有足够的空间,您就可以使用windows资源管理器查看程序集和PDB文件,以查看它们在磁盘上的文件大小


在国际海事组织看来,查看反射是如何实现的是徒劳的。实现细节并不重要。理解您可以将代码视为数据是很重要的。完成这项任务有不同的层次。为了更深入地理解,我推荐或研究其他语言,例如

看。反射发生在远远高于机器语言级别的地方。相关性不会下降到机器语言层,而是停留在IL层。您可以通过查看PDB文件的大小来确定元数据的大小。反射不需要PDB,因为它只能查看EXE;但是,将不存在任何符号。反编译器可以使用IL层重新生成C#程序;然而,你可以把它弄得乱七八糟,这样没人能真正理解到底发生了什么。元数据没有那么大,因为它只存在于两种形式的PDB文件中,并且在程序集的标题信息中,您可以使用工具ILDASM轻松地看到它。@JohnPeters这最好是一个答案,而不是一个注释。@PhilipKendall Ya,毫无疑问,但我已经厌倦了这些论坛上的所有人对答案大加评论。昨天我甚至让一个家伙在一个写得很好、研究得很透彻的问题上否决了我!