.net – Visual Basic,当我的唯一引用是“系统”时,为什么我不能导入“System.Drawing”?

在Visual Studio 10 – Visual Basic中,为什么我的唯一引用是“System”时无法导入“System.Drawing”?我可以导入“System.Runtime.InteropServices”.

重现我的问题:
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”.

.NET公共语言基础结构有两个不同的概念:

>命名空间:类型名称的前缀,例如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.

MSDN has an outdated but still good description of assemblies,namespaces,and the differences between them,which you may find helpful.

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...