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

mdi*_*ger 7 .net vb.net assemblies reference visual-studio-2010

在Visual Studio 10 - Visual Basic中,为什么我的唯一引用是"系统"时无法导入"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".

Mic*_*tha 15

.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.NET Imports语句(及其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对程序集,命名空间以及它们之间的差异有一个过时但仍然很好的描述,您可能会发现它们很有帮助.


Pao*_*lla 7

System.Drawing命名空间"存在"另一个dll中,该dll最初未在类库的模板项目中引用.您必须添加引用System.Drawing(右键单击项目 - >添加引用; System.Drawing在GAC中).

在MSDN上,您可以看到每个类"生活"的程序集.例如,在Bitmap类的文档中,您可以看到:

命名空间:System.Drawing

程序集:System.Drawing(在System.Drawing.dll中)

请注意,在命名空间级别,您无法找到"程序集"信息,因为您可以从不同的程序集向同一名称空间添加类.