典型的Windows二进制文件和.NET二进制文件之间的区别

4
典型的Windows DLL(Win32?COM?不确定它们的称呼)和使用.NET编译的DLL之间有什么区别?
我知道它们是不同的,但我不知道内部工作原理的细节。
我想知道确切的区别是什么。
编辑:尝试在此处添加更多疑问:
为什么我不能像添加.NET DLL一样添加对Win32 DLL的引用?此外,为什么我们必须进行PInvoke?我们如何为.NET DLL进行反射和智能感知,但没有类似Win32 dll的东西?

“起点”是PE头文件。最近的Windows版本对CLR有特殊支持,因此它知道如何加载IL。然后从那里开始...你想去哪里? :) - user166390
好的,我来翻译以下关于编程方面的内容:是的,请让我来。还有,为什么我可以添加对.NET DLL的引用,但不能添加Win32 DLL的引用?此外,为什么我们必须进行PInvoke?另外,我们如何使用反射和智能感知功能来处理.NET DLL,而不能为Win32 DLL提供类似的功能。谢谢回复。 - ashwnacharya
反射对于.NET DLL是可能的,因为.NET运行时可以提供有关代码的信息(类似于虚拟机)。 - Prime
查找“托管代码”和“非托管代码”的区别。这个问题过于宽泛。 - Cody Gray
1个回答

2
你的问题太过宽泛,无法给出完整答案,因此我只会关注你的第一个疑问。
.NET二进制文件本质上是一种“典型”的Windows二进制文件。.NET PE与其他PE一样,具有MZ头、DOS段、PE头、节表和节:.text、.reloc、.rsrc。到目前为止,一切都很正常。一个“典型”的Windows二进制文件包含所有这些东西,只有节因编译器和语言而异。
.text表格包含一个导入表,导入单个DLL mscoree.dll 和一个函数_CorExeMain。它还包含.NET部分:关于程序如何工作(类、方法等)的数据、元数据和IL。
那么当你启动.NET二进制文件时会发生什么?没有什么特别的。它就像一个“典型”的Windows二进制文件一样工作。它调用mscoree.dll来创建.NET运行时,该运行时将加载你可执行文件的.NET部分。该运行时知道如何执行IL。

1
虽然您的答案是正确的,但与问题无关 - 因为 .Net 二进制文件与 .Net DLL 的编译方式不同,而且它们不是本地/向后兼容的(就像 .Net 二进制文件一样)。 - sternr
@user4537:看起来我误解了问题。然而,.NET DLL的行为类似于可执行文件,区别在于导入是“_CorDllMain”而不是“_CorExeMain”。 - user703016
1
@user4537 .NET DLL的确是本地化且向后兼容的。 - Security Hound

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接