重现我的问题:
1.使用Visual Basic类库模板在Visual Studio 10中创建一个新项目.
2.在开头添加“Imports System.Drawing”和“Imports System.Runtime.InteropServices”.
3.删除项目属性的“参考”窗格中“系统”以外的所有引用.
结果:
Visual Studio找不到“System.Drawing”但它可以找到“System.Runtime.InteropServices”. “System.Drawing”是完全限定的,因此系统应该能够在引用的“系统”中找到它.
思考:
看来“System”和“System.Drawing”是不同的命名空间(或容器?),所以为什么没有资格“.”工作? “.”代表别的什么?
“System”也在“mscorlib”中,但是使用的命名空间还是另一个?
“Microsoft.VisualBasic”也列在导入的命名空间中,但没有对它的引用.怎么找到的?填充的“导入的命名空间”列表在哪里?
来自MSDN库的任何相关信息的链接肯定会有所帮助.我已经查看了一段时间,但无法理解为什么不导入“System.Drawing”.
>命名空间:类型名称的前缀,例如System.Drawing,用于区分多个类型,否则这些类型将具有相同的名称.
> Assemblies:可以与其他程序集分开部署,安装和版本化的代码库.程序集中的类型可以是任意数量的命名空间.
命名空间构成基于完整(点)分隔符的层次结构 – 因此您应该认为System.Runtime.InteropServices命名空间中的类型从属于System.Runtime命名空间中的类型.但是,据我所知,CLI不关心命名空间的名称或层次结构,除非它们使您的类型名称唯一.
此外,程序集可以包含来自多个名称空间的类型,甚至是不同层次结构中的类型,并且单个名称空间可以包含在多个程序集中定义的类型.如果您查看.NET库中类型的MSDN文档,它将告诉您该类型所在的程序集.但是,as Paolo Falabella has pointed out, MSDN不会告诉您命名空间所在的程序集,因为单个名称空间可以包含来自多个组件.
在您的场景中:mscorlib是一个程序集,它定义了System命名空间中的某些类型以及许多其他类型,例如System.Runtime.InteropServices,如您所述.但是,您在System.Drawing命名空间中使用的类型位于System.Drawing程序集中.
由于程序集是代码部署和重用的单元,因此Visual Studio项目引用程序集而不是名称空间,因此必须在Visual Studio项目中为程序添加对System.Drawing程序集的引用.
The VB.NET Imports
statement(及其C#等价物,using
directive)允许您引用命名空间中的类型,而无需每次都输入命名空间名称.也就是说,使用Imports System.Drawing,您可以在代码中编写Graphics而不是System.Drawing.Graphics
.但这就是Imports语句所做的全部.特别是:
> Imports System不会自动创建对世界中恰好在System命名空间中定义类型的每个程序集的项目引用.
>导入mscorlib并不意味着您通过其短名称引用“mscorlib”程序集中的每个类型.这意味着您可以通过短名称引用“mscorlib”命名空间中的类型,这不仅完全不同,而且不太可能是您想要的.
底线:如果要访问GDI,则使用System.Drawing命名空间中的类型,但该名称与GDI程序集的名称无关. Microsoft为包含GDI类型的程序集选择了名称“System.Drawing”,但它可以选择“gdiplus-cli”,“gdi-for-dotnet”,甚至“Frobinator”.无论程序集具有什么名称,您都必须添加对该程序集的引用.而你在源代码中没有这样做 – you add assembly references in your Visual Studio project configuration.