- Visual Studio 2015高级编程(第6版)
- (美)Bruce Johnson
- 6410字
- 2021-03-19 15:26:33
2.1 Solution Explorer窗口
只要创建或打开应用程序,或者仅打开一个文件,Visual Studio 2015就会使用解决方案的概念来将所有内容关联在一起。一般情况下,解决方案由一个或多个项目组成,而每个项目可以包含与之相关的多个项。过去,这些项一般是文件,但越来越多的项目包含的项有时是由多个文件组成的,有时根本就不是文件。第6章将详细介绍项目、解决方案的结构以及这些项的相互关系。
Solution Explorer工具窗口(Ctrl+Alt+L组合键)提供了解决方案、项目和各个项的可视化表示,如图2-1所示。在图2-1中,3个项目显示为树型结构:C# WPF应用程序、C# WCF服务库和VB类库。

图2-1
每个项目都有一个相关的图标,它一般表示项目的类型和编写它所用的语言。这条规则有一些例外,如SQL Server和Modeling项目就没有指定语言。
有一个节点要特别注意,因为其字体为黑体。这表示这个项目是启动项目——换言之,选择Debug | Start Debugging或按下F5键时,就会启动这个项目。要更改启动项目,可以右击要设置的项目,并选择Set as StartUp Project命令。要将多个项目设为启动项目,可以从解决方案节点的右击菜单中选择Properties命令,再打开Solution Properties对话框。
在一些环境设置下(参见1.1节),当解决方案中只有一个项目时,解决方案节点是不可见的。这样就不能打开Solution Properties窗口。为显示解决方案节点,可在解决方案中添加另一个项目,或者选择Tools | Options,在打开的Options对话框中选择Projects and Solutions节点中的Always Show Solution项。
Solution Explorer顶部的工具栏提供了与该解决方案相关的许多不同功能,从折叠树状结构中的所有文件到创建Solution Explorer的新实例。例如,第一个按钮Show All Files会展开解决方案列表来显示其他文件和文件夹,如图2-2所示。

图2-2
在这个展开的视图中,可以看到项目结构下面的所有文件和文件夹。但如果文件系统改变,那么Solution Explorer不会自动更新以反映这些改变。使用Refresh按钮 (Show All Files按钮左边的两个按钮)可以确保显示文件和文件夹的当前列表。
Solution Explorer工具栏与上下文相关,根据所选节点的类型显示不同的按钮。图2-2选择了未包含在项目中的两个文件夹bin和obj,图2-1中的其他按钮都不可见。
如果项目中还没有类图,单击View Class Diagram按钮可以插入一个类图,并自动添加所有的类。对于有许多类的项目而言,这相当耗时,而且得到一个大却不实用的类图。一般最好是手动添加一个或多个类图,从而进行全面控制。
还有另一个相对不常用的机制,该机制用于在解决方案的项目和文件间导航。在树状结构中,每一项的左侧有一个图标,单击该图标会显示不同的上下文菜单。在上下文菜单中包含一个名为Scope to This的选项。当单击Scope to This选项时,Solution Explorer中的内容会改变,从而解决方案中的所选节点成为树状视图的最顶层。图2-3显示了针对GettingStarted项目单击Scope to This选项后的视图。

图2-3
除了使用Scope to This选项向下导航解决方案之外,Solution Explorer还允许通过导航前后移动。在Solution Explorer工具栏的左上角有一个左箭头,可以使用该箭头在层次结构中向上导航。因此,如果单击该箭头,就会显示完整的解决方案,如图2-2所示。还有一个朝向右侧的箭头,单击该箭头可以向前导航到作用域视图中。
在Visual Studio 2015中,该扩展视图还显示了给定类的属性和方法。当单击代码文件左侧的图标时,就会显示相应的属性和方法。上下文菜单也会改变以反映选择的项。右击某个类(不是代码文件,而是实际的类)时,对应的上下文菜单包括Base Types、Derived Types和Is Used By选项。这些选项分别将Solution Explorer的作用域改为基类、派生类和所选类使用的其他类。
当继续导航到属性和方法中时,对应的上下文菜单就包括Calls、Is Called By和Is Used By。这些选项分别将Solution Explorer的作用域改为调用该类的其他类、被该类调用的其他类以及该类使用的其他类。
2.1.1 预览文件
Visual Studio 2015最值得瞩目的功能之一是Solution Explorer的文件预览功能。Solution Explorer的顶部有一个按钮,名为Preview Selected Items(如图2-4所示)。单击该按钮后,在Solution Explorer的文件中导航时(为进行导航,必须使用鼠标或光标选择文件),文件会显示在Preview选项卡中,如图2-4所示。

图2-4
此时,文件还没有修改,只是打开以供查看。可以像处理其他任何文件一样自由地在该文件中导航。然而,当导航到Solution Explorer中的另一个文件时,Preview选项卡就会改为显示新文件。换句话说,不再需要采用多个选项卡来查看解决方案中各种文件的内容。
如果决定停止预览文件,Preview选项卡会自动移到编辑器窗口左侧的选项卡组。通过直接编辑文件(例如输入代码)或从Preview选项卡右侧的下拉列表中选择Open选项,即可停止预览。
2.1.2 常见任务
Solution Explorer除了为管理项目和各个项提供一种简便方式外,还有一个动态的上下文菜单,它能快速完成一些最常见的任务,如生成解决方案或单独的项目、访问生成配置管理器、打开文件等。图2-5显示该上下文菜单随Solution Explorer中所选项的不同而改变。

图2-5
左边和中间菜单上的第一项用于生成整个解决方案或选中的项目。在大多数情况下,Build菜单项是最高效的选项,因为它仅生成一个或多个包含的文件产生变化的项目。但是,在一些情况下,无论所有依赖项目的状态如何,都需要重建所有的相关项目。如果要删除生成过程中创建的所有其他文件,可以调用Clean菜单项。这个选项可以打包解决方案,并通过电子邮件把它传送给其他人——这种方式不会包含生成过程创建的所有临时或输出文件。
对于Solution Explorer中的大多数项,上下文菜单的第一部分如图2-5中的菜单所示。其中有默认的Open菜单项和Open With...菜单项,它们可以确定项的打开方式。在处理带有自定义编辑器的文件时,这些菜单项是很有用的,一个常见的例子是RESX文件。Visual Studio 2015默认使用内置的资源编辑器打开这个文件类型,但这会禁止进行某些修改,也不支持我们可能要包含的所有数据类型(第39章会讨论如何在资源文件中使用自己的数据类型)。使用Open With...菜单项时可以改用XML Editor。
Solution、Project和Folder节点的上下文菜单包含Open Folder in File Explorer项。使用该项可以打开Windows Explorer、快速定位所选项的位置,而无须导航到解决方案所在的位置,再查找对应的子文件夹。
1.添加项目和项
在Solution Explorer中,最常执行的操作是添加、删除和重命名项目和项。要在已有的解决方案中添加新项目,应从解决方案节点的上下文菜单中选择Add | New Project命令,打开如图2-6所示的对话框,这个对话框可以对项目模板排序、搜索项目模板。右边的窗格显示了所选项目的信息,如项目的类型及其描述信息(第15章将介绍如何创建自己的项目模板和项模板,包括设置这些属性)。对于某些类型的项目,也可以在创建时把Application Insights遥测技术自动包含到应用程序中。

图2-6
在Add New Project对话框左边的Installed模板层次结构中,模板先按语言排列,再按技术排列。其中包括Office项目类型,允许为大多数Office产品生成应用程序级和文档级的插件。Office插件仍使用Visual Studio Tools for Office (VSTO),它现在内置于Visual Studio 2015中,而不再需要其他的安装程序。第19章将介绍如何使用这些项目类型为Office核心应用程序生成插件。还有Recent模板和Online模板的选项卡。Online模板的排序和搜索方式类似于Installed模板,但排序条件扩展为包含创建日期、排名和下载频率。
在Add New Project对话框中还要注意,可以选择不同的Framework版本。如果已有的项目不希望迁移到.NET Framework的新版本,那么仍可以使用新功能,如改进的IntelliSense功能。但需要安装Visual Studio 2015和以前的.NET Framework版本,才能为早前的Framework版本生成项目。Framework版本选择也包含在搜索条件中,把可用的项目模板列表限制为与所选的.NET Framework版本兼容的项目模板。
在Visual Studio 2015中打开已有的Visual Studio 2012/2013解决方案或项目时,它们仍需要由升级向导升级(更多信息请参见第45章)。确切地说,在Visual Studio 2015中打开项目的操作可能会修改该项目,使其可以在 Visual Studio 2012和Visual Studio 2013(有时甚至是Visual Studio 2010)中打开。这一点非常重要,有必要额外指出其不同之处。这对于开发人员的意义是,他们能够使用Visual Studio 2015修改旧项目(从而获得使用IDE最新版本的优势)。与此同时,已经在Visual Studio 2015中打开的项目仍然会在Visual Studio 2013或2012中打开。对于来自Visual Studio 2010之前版本的项目,将会触发升级向导。第45章将进一步讨论这些问题。
在Visual Studio中,一个最难理解的功能是Web Site项目的概念。这有别于Web Application项目,Web Application项目可以通过之前提到的Add New Project对话框添加。要添加Web Site项目,需要从解决方案节点的上下文菜单中选择Add | Web Site命令,这将显示如图2-7所示的对话框,在这里可以选择要创建的Web项目的类型。大多数情况下,这仅确定在项目中要创建的默认项的类型。

图2-7
一定要注意,图2-7列出的一些Web项目类型也可以通过Add New Project对话框的ASP.NET Web Application选项创建。但是,它们不会生成相同的结果,因为Web Site项目(通过Add New Web Site对话框创建)和Web Application项目(通过Add New Project对话框创建)有重要的区别,这两个项目类型的区别详见第23章。
有了一两个项目后,就需要开始添加项了。这是通过Solution Explorer中项目节点下面的Add上下文菜单项完成的。第一个New Item...子菜单项会打开Add New Item对话框,如图2-8所示。

图2-8
除了列出与所选项目相关的项模板外,Add New Item对话框还可以搜索已安装的模板,以及在线查找第三方生成的模板。
返回Add上下文菜单,注意其中有许多预定义的快捷键,如User Control和Class,具体显示的快捷键取决于在其中添加项的项目的类型。这些快捷键只是绕过了在Add New Item对话框中定位对应模板的阶段。Add New Item对话框仍会显示,因为需要给要创建的项指定名称。
一定要分清是给项目而不是文件添加项。许多模板都只包含一个文件,但一些模板会在项目中添加多个文件,如Window或User Control。
2.添加引用
每个即将发布的新软件开发技术都承诺有较好的重用性,但很少能兑现这个承诺。Visual Studio 2015支持可重用组件的一种方式是通过对项目的引用来实现。如果展开任意一个项目的Reference节点,就会发现其中有许多.NET Framework库,如System和 System.Core,编译器必须包含它们才能成功生成项目。实际上,引用允许编译器解析类型、属性、字段和方法名,并返回给定义它们的程序集。如果要重用某个第三方库中的类,甚至重用自己的.NET程序集中的类,就需要通过Solution Explorer中项目节点的Add Reference上下文菜单项,添加对该程序集的引用。
启动Reference Manager对话框,如图2-9所示,Visual Studio 2015就会查询本地计算机、全局程序集缓存(Global Assembly Cache,GAC)和解决方案,以显示可以引用的已知库的列表,这包括放在不同列表中的.NET和COM引用,以及项目和最近使用的引用。

图2-9
在其他基于项目的开发环境中,如Visual Basic的第1版,可以把对项目的引用添加到解决方案中,而不是添加已编译的二进制组件。这个模型的优点是很容易调试所引用的组件,帮助确保运行所有组件的最新版本,但对于大型解决方案而言,这又不太实用。
如果解决方案包含大量项目(“大型”解决方案是相对计算机而言的,但项目的数量一般超过20),就应考虑生成多个引用项目子集的解决方案。加载和生成操作实际上是并行完成的,有助于提高速度。当然,尽量减少解决方案中的项目数量可以确保在生成整个应用程序期间方便地进行调试。但要注意的是,将项目分离到不同的解决方案中并不像最初想象得那样容易。这并不是因为很难进行项目分离(实际上很容易分离),而是因为根据自己的目标,会发现有许多可能是“最佳的”不同分离方法。例如,可以创建不同的解决方案来支持生成配置(参见第46章),用于生成一个项目子集。
3.添加服务引用
Solution Explorer提供的另一类引用是服务引用。这些引用一度称为Web引用,但随着Windows Communication Foundation (WCF)的推出,现在有更一般的Add Service Reference菜单项。这会打开Add Service Reference对话框,如图2-10所示。在这个例子中,Discover按钮的下拉列表用于在Solution中查找Services。

图2-10
如果Visual Studio 2015 在试图访问服务信息时出错,该对话框会提供一个超链接,以打开Add Service Reference Error对话框。它一般会给出解决问题的足够信息。
在图2-10的左下角有一个Advanced按钮。单击该按钮会打开Service Reference Settings对话框,该对话框可以定制把哪些类型定义为服务引用的一部分。默认情况下,服务使用的所有类型都会在客户端应用程序中重新创建,除非在服务和应用程序同时引用的程序集中实现它们。该对话框的Data Type区域用于改变这种行为。Service Reference Settings对话框的左下角还有一个Add Web Reference按钮,它可添加更传统的.NET Web服务引用。如果有一些限制或试图支持系统之间的操作,这个按钮就很重要。在应用程序中添加服务的内容详见第33章。
4.添加连接的服务
目前,应用程序更依赖外部服务来提供一些常见功能。虽然总是可以自由浏览服务提供商的网站,下载客户端程序集(或阅读API的文档),实现应用程序要求的功能,但Visual Studio 2015提供了一个工具来简化该过程,降低复杂性。调用该工具,需要使用Add上下文菜单中的Add Connected Services选项。
选择Add Connected Services选项,会显示如图2-11所示的对话框。

图2-11
其中有很多的选项,还可以使用一种相对简单的方法来找到更多选项。Microsoft提供的选项包括Application Insights、Azure Mobile Services、Azure Storage和Office 365 API。对于Salesforce,可使用其连接的服务来访问Salesforce账户中的数据。
一旦选择一个服务,Configure按钮就会激活。单击Configure,执行必要的步骤,给项目添加程序集、配置和支持文件。需要提供的细节随服务的类型而不同,所以它们超出了本书的范围。但总的来说,需要为可以访问服务的账户提供一个凭据(如访问Azure功能的Microsoft Live账户)。
在这个对话框中出现了一个服务,并不总是意味着该服务支持当前的项目。在对话框的右边,版本和创建者信息的下面,是一个是否支持当前项目类型的指示器。只有支持当前项目类型时, Configure按钮才是可用的。
如图2-11所示对话框的底部,有一个Find More Services链接。点击这个链接,会显示Extensions and Updates对话框,如图2-12所示。

图2-12
可以使用Extensions and Updates对话框安装许多不同的工具,而在这个实例中,目前位于Connected Services部分下(见列表左侧)。如果想使用其他服务,可以选择适当的服务,单击显示的Download 或 Install按钮。
5.添加分析器
Visual Studio 2015使用的编译器已经完全重写。无论是否知道这一点,.NET的编译都是Visual Studio多年来一直在做的一个主要工作。
我们得到的IntelliSense就是不断在后台运行的编译过程和更新语法树的结果,这样,例如给项目添加类时,IntelliSense可以在解决方案的其他地方显示这个类的属性和方法。
这种改写的一个优点是,第三方软件现在可以访问编译过程产生的语法树。这个工具称为代码分析器,可与代码密切合作,识别问题并提供解决方案。
如果要在一个项目中添加分析器,有很多选择。在Solution Explorer中,右击项目,并从上下文菜单中选择Add | Analyzer选项,显示如图2-13所示的对话框。

图2-13
该对话框的功能并不是特别引人注目。如果最近已给项目添加了一个分析器程序集,它就会显示在默认显示的最近添加的分析器列表中。也可以浏览到已经安装到计算机上的分析器程序集的位置,把它包括在项目中。
6.添加NuGet包
在过去的几年中,NuGet已经成为可以在应用程序中使用的包的首选位置。通过不同的扩展,给项目添加NuGet包的方式已经演变成两个独立的工作流。
最方便访问的工作流涉及使用已在Visual Studio 2015中修改的图形界面。在Solution Explorer中,右击要添加包的项目,从上下文菜单中选择Manage NuGet Packages,这将显示如图2-14所示的页面。

图2-14
该对话框的作用是允许搜索所需的包。页面的顶部是一些控件,它们会影响返回的包的细节。左边的下拉框Package Source用于选择要搜索的NuGet存储库。可以根据以前已经安装的包、是否有可用的更新包,或者是否想在列表中包括预发行的版本(例如测试版本)来过滤包。最后,右边的文本框用来指定正在寻找的包。如图2-14所示,标题或描述中包含angular这个词的所有包都显示出来了。
一旦识别出所需的包,就在页面的左边单击它,在右边显示具体的细节。要安装包,可以单击Install按钮。默认情况下,这会安装最新版本。如果所选的包有很多不同的版本,就可以从Version下拉框中选择一个特定的版本。
在包的细节下面,有很多影响安装过程的选项。首先是Show Preview Window复选框。如果单击Install按钮时选择了这个复选框,就会显示一个要添加到项目中的文件列表。该列表显示在一个如图2-15所示的对话框中。单击OK继续安装,而单击Cancel将终止安装。

图2-15
Dependency Behavior下拉框控制是否加载依赖项,以及加载哪个依赖项。在图2-15中,需要安装4个依赖项。为了理解其差异,考虑一个依赖项:jQuery 1.7。这是所安装组件需要的最低的jQuery版本。这个安装将使用这个版本,因为Dependency Behavior选中了Lowest。其他选项包括Highest(需要最高的主要版本)、Highest Minor (需要最高的主要和次要版本)和Highest Patch (需要最新版本的补丁)。还可以简单地忽略依赖项。
有一个选项用于处理文件冲突。它给出的选择是提示要安装同一个文件的不同版本、自动用新文件覆盖现有的文件,以及自动忽略任何已有的文件。
安装NuGet包必须指定的第二个选项是进入一个命令窗口。要启动如图2-16所示的窗口,可以选择Tools | NuGet Package Manager | Package Manager Console菜单项。

图2-16
一旦准备好命令窗口,就可以输入具体的NuGet命令来安装所需的包。在图2-16中,安装了angularjs包的1.3.15版本。通过命令行,很容易安装、更新或卸载任何需要的包,但各种命令的详细信息超出了本书的范围。