簡體   English   中英

.NET如何解析類型?

[英]How does .NET resolve types?

我很好奇.net如何解析類型。 我知道有一個編譯時組件,因為您不能編譯具有使用當前程序集或引用程序集中所沒有的語句或完全限定類型的程序。 我想知道是編譯器遇到了錯誤,還是Visual Studio在proj文件中找不到引用時引發了構建錯誤?

我也想知道.net如何在運行時找到程序集。 我知道.net使用JIT編譯器在它第一次從該程序集運行為類型時加載程序集。 我很好奇如何尋找類型和搜索順序。 程序集清單是否告訴運行時准確在哪里查找引用的程序集(如ASP.NET web.config文件)? 任何對博客文章,書籍,規格等的鏈接將不勝感激。

當您使用無法識別的標識符時,錯誤消息的最終來源是編譯器。 您將收到IntelliSense的預警,它將紅色的花鍵放在標識符名稱下。

編譯器在從源代碼生成的程序集的元數據中記錄程序集,名稱空間和類型名稱。 對於程序集,它記錄顯示名稱(如System),它在參考程序集中找到的[AssemblyVersion]和PublicKeyToken(與強命名程序集相關的值)。

在運行時,CLR的任務是僅使用這三個裝配屬性來找到裝配。 抖動將是要求CLR在需要生成代碼時找到它的抖動。 關於它,有一些晦澀的細節,它們與覆蓋正常的查找規則有關,您可以在任何有關.NET或MSDN的好書中找到它們的文檔。 MSDN文章將詳細介紹。

通常的方法是,它首先在GAC中查找,它是程序集的存儲庫以及所有.NET Framework程序集的存儲位置。 GAC是特殊的,因為它可以存儲具有相同名稱但不同版本的多個程序集,這是強大的DLL Hell對策。 如果在該處找不到它,則使用與這三個屬性以及體系結構的完全匹配,然后在存儲EXE的目錄中查找,如果顯示名稱匹配,則接受匹配。 如果所有程序集屬性都匹配,並且可以使用相同的名稱空間和類型名稱找到類型,那么一切都很好。

暫無
暫無

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

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