Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Visual Basic,为什么可以';“进口”;系统图纸“;当我唯一的参考是;系统";?_.net_Vb.net_Visual Studio 2010_Assemblies_Reference - Fatal编程技术网

.net Visual Basic,为什么可以';“进口”;系统图纸“;当我唯一的参考是;系统";?

.net Visual Basic,为什么可以';“进口”;系统图纸“;当我唯一的参考是;系统";?,.net,vb.net,visual-studio-2010,assemblies,reference,.net,Vb.net,Visual Studio 2010,Assemblies,Reference,在visualstudio10-visualbasic中,当我的唯一引用是“System”时,为什么不能导入“System.Drawing”?我可以导入“System.Runtime.InteropServices” 重现我的问题: 1.使用Visual Basic类库模板在Visual Studio 10中创建新项目。 2.在开头添加“Imports System.Drawing”和“Imports System.Runtime.InteropServices”。 3.删除项目属性的“引用”窗

在visualstudio10-visualbasic中,当我的唯一引用是“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”和“System.Drawing”是不同的名称空间(或容器?),那么为什么“.”不起作用呢?“.”代表其他的东西吗

“System”也在“mscorlib”中,但使用的名称空间是该名称空间还是另一名称空间

“Microsoft.VisualBasic”也列在导入的名称空间中,但没有对它的引用。它是怎么找到的?“导入的名称空间”列表从何处填充


链接到MSDN库中的任何相关信息肯定会有所帮助。我已经查看了一段时间,但无法理解为什么没有导入“System.Drawing”。

System.Drawing
位于需要引用的单独程序集中。

System.Drawing命名空间“位于”另一个dll中,该dll最初在类库的模板项目中没有引用。 您必须添加对
System.Drawing
的引用(右键单击项目->添加引用;系统.Drawing位于GAC中)

在MSDN上,您可以看到每个类“使用”的程序集。例如,在的文档中,您可以看到:

名称空间:System.Drawing

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


请注意,您找不到“程序集”信息,因为您可以从不同的程序集向同一命名空间添加类。

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

  • 名称空间:类型名称的前缀,如
    System.Drawing
    ,用于区分多个否则将具有相同名称的类型
  • 可以与其他程序集分开部署、安装和版本控制的代码库。程序集中的类型可以在任意数量的名称空间中
名称空间基于句号(点)分隔符形成层次结构-因此您应该认为
System.Runtime.InteropServices
名称空间中的类型从属于
System.Runtime
名称空间中的类型。但是,据我所知,CLI并不关心名称空间的名称或层次结构,除非它们使您的类型名唯一

此外,程序集可以包含来自多个名称空间的类型,甚至是来自不同层次结构中的名称空间的类型,单个名称空间可以包含在多个程序集中定义的类型。如果查看.NET库中某个类型的MSDN文档,它将告诉您该类型在哪个程序集中。但是,MSDN不会告诉您命名空间所在的程序集,因为单个命名空间可以包含来自多个程序集的类型

在您的场景中:
mscorlib
是一个程序集,它定义了
系统
命名空间中的某些类型以及许多其他类型,如您所提到的
系统.Runtime.InteropServices
。但是,您在
System.Drawing
命名空间中使用的类型位于
System.Drawing
程序集中

由于程序集是代码部署和重用的单元,Visual Studio项目引用的是程序集,而不是命名空间,因此您必须在Visual Studio项目中为您的程序添加对System.Drawing程序集的引用

(及其C#等价物)允许您引用命名空间中的类型,而无需每次都键入命名空间名称。也就是说,通过导入System.Drawing,您可以在代码中编写
图形
,而不必使用。但这就是Imports声明所做的一切。特别是:

  • 导入系统
    不会自动创建对世界上碰巧在系统命名空间中定义类型的每个程序集的项目引用
  • Imports mscorlib
    并不意味着您通过其短名称引用“mscorlib”程序集中的每个类型。这意味着您可以通过短名称引用“mscorlib”命名空间中的类型,这不仅完全不同,而且不太可能是您想要的
底线:如果希望访问GDI+,那么可以使用System.Drawing命名空间中的类型,但该名称与GDI+程序集的名称无关。Microsoft为包含GDI+类型的程序集选择了名称“System.Drawing”,但它可以选择“gdiplus cli”、“GDI for dotnet”甚至“Frobinator”。无论程序集具有什么名称,都必须添加对该程序集的引用。在源代码中没有这样做-


即使添加了系统图纸作为参考,它仍然不能包含在项目中

因此,如果我理解正确,
imports System
将引入定义整个
System
命名空间的所有程序集。另一方面,
imports mscorlib
只会拉入其装配定义的零件。否!Imports语句仅适用于名称空间。它对程序集一无所知。我将编辑我的答案来解释这一点。这是一个重要的区别,很有意义。在您解释这一点之前,我会声明引用通过提供资源文件位置使资源可供导入;然而,这些资源只能是实际的