操作系统如何区分.net dll和其他dll?

时间:2013-06-16 08:47:37

标签: c# .net operating-system

DLL是动态链接库,在运行时受到限制。在系统中,有不同语言的dll,如C ++,c,.net等。我的问题是操作系统如何区分.net dll和其他dll?

例如,如果我在C ++中创建了a.dll而在C#.net中创建了a.dll,那么现在在.net项目中我引用了a.dll(C#)。操作系统如何区分a.dll(C#)和a.dll(C ++)进程,这两个进程都在运行。

2 个答案:

答案 0 :(得分:2)

Windows将Portable Executation Format用于.Net DLL和可执行文件。来自该Wiki文章的摘录:

  

Microsoft的.NET Framework扩展了PE格式,其功能支持公共语言运行时(CLR)。其中包括CLR标题和CLR数据部分。加载二进制文件后,OS加载程序通过PE / COFF IMPORT表中的引用生成执行到CLR。然后CLR加载CLR标题和数据部分。

     

CLR数据部分包含两个重要部分:元数据和中间语言(IL)代码:

     

元数据包含与程序集相关的信息,包括程序集清单。清单详细描述了程序集,包括唯一标识(通过哈希,版本号等),导出组件的数据,扩展类型信息(由公共类型系统(CTS)支持),外部引用和文件列表在集会内。 CLR环境广泛使用元数据。

     

中间语言(IL)代码是抽象的,与语言无关的代码,满足.NET CLR的通用中间语言(CIL)要求。术语“中间”是指IL代码的本质是跨语言和跨平台兼容。这种中间语言类似于Java字节码,允许平台和语言支持常见的.NET CLR。 IL支持面向对象的编程(多态,继承,抽象类型等),异常,事件和各种数据结构。

Here is an MSDN article discussing the Portable Execution Format.

Here is part 2 of that article.

该文章的相关摘录:

  

为Microsoft .NET环境生成的可执行文件首先是PE文件。但是,在大多数情况下,.NET文件中的普通代码和数据都很少。 .NET可执行文件的主要目的是将特定于.NET的信息(如元数据和中间语言(IL))放入内存中。

     

此外,.NET可执行文件链接MSCOREE.DLL。此DLL是.NET进程的起点。加载.NET可执行文件时,其入口点通常是一小段代码。该存根只是跳转到MSCOREE.DLL(_CorExeMain或_CorDllMain)中的导出函数。从那里,MSCOREE负责,并开始使用可执行文件中的元数据和IL。

     

此设置类似于Visual Basic(.NET之前)中的应用程序使用MSVBVM60.DLL的方式。 .NET信息的起点是IMAGE_COR20_HEADER结构,目前在.NET Framework SDK和更新版本的WINNT.H中的CorHDR.H中定义。 DataDirectory中的IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR条目指向IMAGE_COR20_HEADER。

它讨论了可执行文件,但PE格式也用于.Net DLL。

有关详细信息,请参阅文章本身。如你所见,这些东西并不简单!

答案 1 :(得分:1)

操作系统永远不会涉及。 DLL类的托管程序集使用Assembly.Load()和朋友加载。当抖动编译代码时,隐含地根据需要。或者在代码中使用其中一个Assembly.Load变种时显式。

操作系统涉及的唯一时间是启动EXE。以后的Windows版本(XP及更高版本)可以识别托管的EXE。确切的机制没有记录,除了mscoree.dll是一个重要的播放器,它充当加载器的存根,并且是实际获取CLR的辅助DLL。 Windows会自动加载它,可能是因为它看到了可执行文件中的CLR头。

对于旧的Windows版本(Windows 98和2000)没有这种意识,EXE包含5个字节的非托管代码。只是跳转到mscoree.dll中的_CorExeMain()函数。这就是加载CLR的正常工作。操作系统需要涉及更高版本,因为32位EXE可以作为64位进程执行的特殊功能。涉及到动态修改可执行文件以创建64位进程的hackorama非常精细。