簡體   English   中英

操作系統如何區分.net dll和其他dll?

[英]How does OS differentiate between .net dll and other dll's?

DLL是動態鏈接庫,在運行時被限制。 在系統中,有一個用於C ++,C,.net等不同語言的dll。我的問題是OS如何區分.net dll和其他dll?

例如,如果我在C ++中創建了一個.dll,在C#.net中創建了一個.dll,現在在.net項目中,我指的是a.dll(C#)。 操作系統如何區分引用兩者的a.dll(C#)和a.dll(C ++)進程正在運行。

Windows使用.Net DLL和可執行文件的Portable Executation Format 該Wiki文章的摘錄:

Microsoft的.NET Framework通過支持公共語言運行時(CLR)的功能擴展了PE格式。 其中包括CLR標頭和CLR數據部分。 加載二進制文件后,OS加載程序通過PE / COFF IMPORT表中的引用將執行提交給CLR。 然后,CLR加載CLR標頭和數據部分。

CLR數據部分包含兩個重要的部分:元數據和中間語言(IL)代碼:

元數據包含與程序集相關的信息,包括程序集清單。 清單詳細描述了程序集,包括唯一標識(通過哈希,版本號等),有關導出的組件的數據,廣泛的類型信息(由公共類型系統(CTS)支持),外部引用以及文件列表在裝配體內。 CLR環境廣泛使用元數據。

中間語言(IL)代碼是抽象的,獨立於語言的代碼,它滿足.NET CLR的公共中間語言(CIL)的要求。 術語“中間”是指IL代碼具有跨語言和跨平台兼容的性質。 這種中間語言類似於Java字節碼,允許平台和語言支持通用的.NET CLR。 IL支持面向對象的編程(多態性,繼承,抽象類型等),異常,事件和各種數據結構。

這是MSDN文章,討論可移植執行格式。

這是該文章的第2部分。

該文章的相關摘錄:

為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中定義。 IMAGE_COR20_HEADER由DataDirectory中的IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR條目指向。

它討論了可執行文件,但PE格式也用於.Net DLL。

有關詳細信息,請參見文章本身。 如您所見,這些東西並不簡單!

永遠不會涉及操作系統。 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非常復雜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM