Dot-Net

Visual Basic,當我唯一的參考是“System”時,為什麼我不能導入“System.Drawing”?

  • February 20, 2014

在 Visual Studio 10 - Visual Basic 中,當我唯一的參考是“System”時,為什麼我不能導入“System.Drawing”?我可以導入“System.Runtime.InteropServices”。

重現我的問題:

  1. 在 Visual Studio 10 中使用 Visual Basic 類庫模板創建一個新項目。

2.在開頭添加“Imports System.Drawing”和“Imports System.Runtime.InteropServices”。

  1. 在項目屬性的“參考”窗格中刪除除“系統”之外的所有參考。

結果:Visual Studio 找不到“System.Drawing”,但可以找到“System.Runtime.InteropServices”。“System.Drawing”是完全限定的,因此系統應該能夠在引用的“System”中找到它。

想法:看起來“​​System”和“System.Drawing”是不同的命名空間(或容器?)所以為什麼不限定“。” 工作?做 ”。” 代表別的東西?

“系統”也在“mscorlib”中,但這是使用的名稱空間還是另一個名稱空間?

“Microsoft.VisualBasic”也列在導入的命名空間中,但沒有對其的引用。它是如何被發現的?“導入的命名空間”列表是從哪裡填充的?

指向 MSDN 庫中任何相關資訊的連結肯定會有所幫助。我已經瀏覽了一段時間,但不明白為什麼沒有導入“System.Drawing”。

.NET 公共語言基礎結構有兩個不同的概念:

  • **命名空間:**類型名稱的前綴,例如System.Drawing,用於區分多個類型,否則它們將具有相同的名稱。
  • 程序集:可以與其他程序集分開部署、安裝和版本控制的程式碼庫。程序集中的類型可以位於任意數量的命名空間中。

命名空間基於句點(點)分隔符形成層次結構 - 因此您應該認為System.Runtime.InteropServices命名空間中的類型從屬於命名空間中的類型System.Runtime。但是,據我所知,CLI 並不關心名稱空間的名稱或層次結構,除非它們使您的類型名稱獨一無二。

此外,程序集可以包含來自多個命名空間的類型,甚至是不同層次結構中的類型,*並且單個命名空間可以包含在多個程序集中定義的類型。*如果您查看 .NET 庫中某個類型的 MSDN 文件,它會告訴您該類型在哪個程序集中。但是,正如 Paolo Falabella 所指出的, MSDN 不會告訴您命名空間在哪個程序集中,因為單個命名空間可以包含來自多個程序集的類型。

在您的場景中:mscorlib是一個程序集,它定義了System命名空間中的某些類型以及許多其他類型,例如System.Runtime.InteropServices,正如您所指出的。但是,您在System.Drawing命名空間中使用的類型位於System.Drawing程序集中。

由於程序集是程式碼部署和重用的單元,Visual Studio 項目引用程序集,而不是命名空間,因此您必須在程序的 Visual Studio 項目中添加對 System.Drawing 程序集的引用。

VB.NETImports語句(和它的 C# 等價物,using指令)讓您可以引用命名空間中的類型,而不必每次都輸入命名空間名稱。也就是說,使用Imports System.Drawing,您可以編寫Graphics程式碼而不是System.Drawing.Graphics. 但這就是Imports 語句的*全部作用。*尤其是:

  • Imports System不會自動為世界上碰巧在 System 命名空間中定義類型的每個程序集創建項目引用。
  • Imports mscorlib並不意味著您通過短名稱引用“mscorlib”程序集中的每個類型。這意味著您可以通過短名稱引用“mscorlib”命名空間中的類型,這不僅完全不同,而且不太可能是您想要的。

底線:如果您想訪問 GDI+,則使用 System.Drawing 命名空間中的類型,但該名稱與 GDI+ 程序集的名稱無關。Microsoft 為包含 GDI+ 類型的程序集選擇了名稱“System.Drawing”,但它也可以選擇“gdiplus-cli”、“gdi-for-dotnet”甚至“Frobinator”。無論該程序集有什麼名稱,您都必須添加對該程序集的引用。而且您不會在原始碼中這樣做 -您在 Visual Studio 項目配置中添加程序集引用。

MSDN 對程序集、命名空間以及它們之間的區別有一個過時但仍然很好的描述,您可能會發現這些描述很有幫助。

引用自:https://stackoverflow.com/questions/8930883