加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-17 00:20:13 所属栏目:大数据 来源:网络整理
导读:在Visual Studio 10 – Visual Basic中,为什么我的唯一引用是“System”时无法导入“System.Drawing”?我可以导入“System.Runtime.InteropServices”. 重现我的问题: 1.使用Visual Basic类库模板在Visual Studio 10中创建一个新项目. 2.在开头添加“Impor
在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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读