Visual Studio 2015高级编程(第6版)
上QQ阅读APP看书,第一时间看更新

6.6 项目属性

右击Solution Explorer中的Project节点,并选择Properties命令,或者双击Project节点下面的My Project(C#中的Properties),都可以访问项目的属性。与解决方案属性不同,项目属性并不显示在模态对话框中,而是显示在与代码文件并排的选项卡中。这样更便于在代码文件和项目属性之间切换,还可以同时打开多个项目的属性。图6-6显示了一个Visual Basic Windows Forms项目的设置。本节介绍Visual Basic和C#项目的编辑器上的垂直选项卡。

图6-6

项目属性编辑器的一系列垂直选项卡将属性划分为不同的组。在选项卡中对属性进行更改时,相应的垂直选项卡上会显示一个星号。但这个功能非常有限,因为它不能指出选项卡中的哪些字段已经被修改。

6.6.1 Application选项卡

Visual Basic Windows Forms项目的Application选项卡如图6-6所示,它允许开发人员设置编译项目时所创建的程序集的信息。这包括输出类型(即Windows Application、Console Application、Class Library、Windows Service或Web Control Library)、应用程序图标、启动对象和目标.NET Framework版本等属性。C#应用程序的Application选项卡(如图6-7所示)有不同的格式,并且提供了稍有不同的(减少的)一组选项,例如能够直接配置应用程序清单。

图6-7

1.Assembly Information对话框

以前必须在项目的AssemblyInfo文件中手动配置的属性现在可以通过Assembly Information按钮来设置。这些信息非常重要,在安装应用程序或者在Windows Explorer中查看文件的属性时,就会显示这些信息。图6-8(a)是一个示例应用程序的程序集信息,而图6-8(b)是已编译的可执行程序的属性。

图6-8

在Assembly Information对话框中设置的每一个属性都由一个应用到程序集的特性表示。这意味着可以在代码中查询程序集,获取这些信息。在Visual Basic中,也可以使用My.Application.Info名称空间来获取这些信息。

2.User Account Control设置

Visual Studio 2015支持开发使用Windows Vista、Windows 7和Windows 8中的User Account Control (UAC)的应用程序。这涉及生成程序集清单文件,它是一个XML文件,用于通知操作系统应用程序在启动时是否需要管理员权限。在Visual Basic应用程序中,Application选项卡上的View Windows Settings按钮可用于给应用程序的UAC生成和添加程序集清单文件。下面的代码是Visual Studio生成的默认清单文件:

      <?xml version="1.0" encoding="utf-8"?>
      <asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"
             xmlns:asmv1="urn:schemas-microsoft-com:asm.v1"
             xmlns:asmv2="urn:schemas-microsoft-com:asm.v2"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
        <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
          <security>
            <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
              <!-- UAC Manifest Options
                 If you want to change the Windows User Account Control level replace the
                 requestedExecutionLevel node with one of the following.
              <requestedExecutionLevel  level="asInvoker" />
              <requestedExecutionLevel  level="requireAdministrator" />
              <requestedExecutionLevel  level="highestAvailable" />
                 If you want to utilize File and Registry Virtualization for backward
                 compatibility then delete the requestedExecutionLevel node.
              -->
              <requestedExecutionLevel level="asInvoker" />
            </requestedPrivileges>
            <applicationRequestMinimum>
              <defaultAssemblyRequest permissionSetReference="Custom" />
              <PermissionSet ID="Custom" SameSite="site" />
            </applicationRequestMinimum>
          </security>
        </trustInfo>
      </asmv1:assembly>

如果UAC请求的执行级别从默认的asInvoker改为require Administrator,Windows就会在启动应用程序时显示UAC提示。启用了UAC后,如果在调试模式下启动需要管理员权限的应用程序, Visual Studio 2015还会提示在管理员模式下重启。图6-9显示了Windows中的这些提示,允许在管理员模式下重启Visual Studio。

图6-9

如果同意重启,Visual Studio就会用管理员权限重启,并重新打开解决方案及其中的所有文件。它甚至会记住光标的上一个位置。

3.Application Framework对话框(仅限于Visual Basic)

Visual Basic Windows Forms项目还可以使用其他应用程序设置,因为它们使用了Visual Basic独有的Application Framework(应用程序框架)。该框架扩展了标准的事件模型,提供了一系列控制应用程序行为的应用程序事件和设置。要启用Application Framework,可以选中Enable Application Framework复选框。下面的3个复选框控制Application Framework的行为:

Enable XP Visual Styles:XP可视化风格可以显著改进在Windows XP或以后版本上运行的应用程序的外观和操作方式,它使用光标停放在其上时可以动态改变颜色的圆角按钮和控件,提供更加柔和的界面。默认情况下,Visual Basic应用程序将启用XP风格。在Project Settings对话框中可以禁用该效果,或者在代码中通过Application类的EnableVisualStyles方法控制它。

Make Single Instance Application:大多数应用程序都支持多个实例的并发运行。但是,一个打开两三次或更多次的应用程序只能运行一次,后续的执行仅是调用原来的应用程序。文档编辑器就是这类应用程序,以后对它的执行仅是打开不同的文档。只需要将应用程序标记为单一实例,就可以添加该功能。

Save My Settings on Shutdown:这个选项将确保保存对用户作用域设置的全部更改,在关闭应用程序之前会保存所有的设置。

这里也允许为应用程序选择身份验证模式,该模式默认设置为使用当前登录用户的Windows身份验证模式。选择Application-defined可以使用定制的身份验证模式。

还可以在应用程序第一次启动时标识用作闪屏的窗体,以及指定应用程序的关闭行为。

6.6.2 Compile选项卡(仅用于Visual Basic)

项目设置的Compile区域(如图6-10所示)允许开发人员控制项目的生成方式和位置。例如,可以更改输出路径,使其指向另一个位置。如果生成过程的其他地方需要使用输出,就可以在这里设置。

图6-10

选项卡顶部的Configuration下拉选择器可以给Debug和Release生成配置选择不同的生成设置。

如果对话框没有Configuration下拉选择器,就需要在Options窗口(在Tools菜单中访问)的Projects and Solutions节点下选择Show Advanced Build Configurations属性。但在一些内置的设置配置文件(如Visual Basic Developer配置文件)中没有选择这个属性。

也可以在Compile窗格中配置Visual Basic特有的一些属性。Option Explicit规定了代码中使用的变量必须显式定义。Option Strict要求必须定义变量的类型,而不能后期绑定。Option Compare用于决定字符串比较是使用二元比较运算符还是文本比较运算符。Option Infer指定是允许在变量声明中进行本地类型引用,还是必须显式地声明类型。

这4个编译器选项都可以在项目级或文件级上控制。文件级编译器选项会覆盖项目级编译器选项。

Compile窗格还定义了很多不同的编译器选项,可以调整它们以改进代码的可靠性。例如,未使用的变量只产生一条警告,而某个没有返回值的路径的问题更加严重,应产生生成错误。可以禁用所有这些警告,或者将它们全部作为错误处理。

Visual Basic开发人员可以生成XML文档。当然,由于生成XML文档需要时间,因此建议为调试生成禁用该选项。这可以缩短调试的周期。但关闭这个选项,也不会为缺少XML文档而发出警告。

Compile窗格的最后一个元素是Build Events按钮。单击该按钮可以看到在生成前后执行的命令。由于并不是所有的生成都能成功,因此生成后事件的执行依赖于成功的生成。在C#项目的项目属性页面中,Build Events是一个单独的垂直选项卡,用于配置生成前后的事件。

6.6.3 Build选项卡(仅用于C#和F#)

C#中的Build选项卡(如图6-11所示)等价于Visual Basic的Compile选项卡,它允许开发人员指定项目的生成配置设置。例如,可以启用Optimize code设置使输出的程序集更小、更快、更高效。这些优化功能一般会增加生成时间,所以不建议用于Debug生成。

图6-11

在Build选项卡上,可以启用DEBUG和TRACE编译常量。另外,在Conditional compilation symbols文本框中也很容易定义自己的常量。在编译期间,这些常量的值可以在代码中查询。例如, DEBUG常量的查询如下所示:

C#

      #if(DEBUG)
          MessageBox.Show("The debug constant is defined");
      #endif

VB

      #If DEBUG Then
          MessageBox.Show("The debug constant is defined")
      #End If

在Advanced Compiler Settings对话框中定义编译常量,单击Compile选项卡中的Advanced Compile按钮,就可以打开这个对话框。

选项卡顶部的Configuration下拉选择器可以为Debug和Release生成配置指定不同的生成设置。生成选项的更多信息可参见第46章。

6.6.4 Build Events选项卡(仅用于C#和F#)

Build Events选项卡可以在生成过程之前或之后执行其他操作。在图6-12中,有一个生成后事件,在每个成功的生成过程后,将生成输出到Solution文件夹中的一个不同位置。

图6-12

在命令行上可以使用环境变量(如ProgramFiles),环境变量应括在百分号中。还可以使用许多宏,如ProjectName和SolutionDir。当单击Edit Pre-build和Edit Post-build对话框中的Macros按钮时就会列出这些宏,可以根据需要将这些宏插入命令中。

6.6.5 Debug选项卡

Debug选项卡(如图6-13所示)用于决定在Visual Studio 2015中如何执行应用程序。对于Web应用程序,这个选项卡不可见,它使用Web选项卡配置类似的选项。

图6-13

1.Start Action

当一个项目设置为启动时,这组单选按钮可以控制应用程序在Visual Studio中运行时要处理的工作。默认值为Start project,表示调用在Application选项卡中指定的Startup对象。其他的选项包括运行可执行文件或者启动某个特定的网站。

2.Start Options

在运行应用程序时,可以指定其他命令行参数(通常与可执行文件的启动操作一起使用)和初始工作目录。也可以指定在远程计算机上启动应用程序。当然,这要求在远程计算机上启用调试功能。

3.Enable Debuggers

可以扩展调试功能以包含非托管代码和SQL Server。也可以在这里启用Visual Studio宿主进程(hosting process)。该进程为与调试器相关的功能和性能带来很大的益处,主要分为3类优点。首先,宿主进程可用作需要调试的应用程序的后台主机。为了调试托管应用程序,必须执行不同的管理任务,如创建AppDomain和关联调试器,这都会占用时间。启用宿主进程后,这些任务都可以在后台处理,从而在调试时可以大幅缩短加载时间。

其次,在Visual Studio 2015中,更容易创建、调试和部署在部分信任模式下运行的应用程序。在该过程中,宿主进程是一个重要的工具,它提供了在部分信任模式下运行和调试应用程序的能力。如果没有该进程,应用程序就会在完全信任模式下运行,而无法在部分信任模式下调试。

宿主进程带来的最后一个益处是可以在设计时计算表达式。这实际上是一个视觉假象,因为宿主进程实际上一直在后台运行。尽管如此,编写代码时使用Immediate窗口,就可以轻松地计算表达式、调用方法,甚至停在断点处,而无须运行整个应用程序。

6.6.6 References选项卡(仅用于Visual Basic)

References选项卡允许开发人员引用其他.NET程序集、项目和本地DLL中的类。在引用列表中添加项目或DLL后,就可以通过类的全名(包含名称空间)访问类。也可以将名称空间导入代码文件,这样仅通过类名就可以访问类。图6-14是一个项目的References选项卡,它引用了大量的框架程序集。

图6-14

在项目中存在未使用的引用并不是问题。一些人并不喜欢存在这样的引用,因为它会使解决方案“杂乱无章”,但从性能角度看,未使用的引用并不会带来影响。未使用的程序集不会复制到输出目录中。

一旦在引用列表中添加程序集,就可以在项目中引用该程序集包含的所有公共类。如果类嵌入在一个名称空间(可能是一个嵌套的层次结构)中,引用类时就必须使用完整的类名。Visual Basic和C#都提供了导入名称空间的机制,所以可以直接引用类。References部分允许为项目中的所有类全局导入名称空间,而不需要在类文件中显式导入。

引用外部程序集也可以通过文件引用或项目引用。文件引用是直接引用某个程序集。使用Add Reference对话框的Browse选项卡就可以创建文件引用。项目引用是对解决方案内部的项目的引用。该项目输出的所有程序集都动态添加为引用。使用Reference Manager对话框的Solution选项卡可以创建项目引用。

警告:不要在项目中添加同一个解决方案中已有的文件引用。如果项目需要引用该解决方案中的另一个项目,就应该总是使用项目引用。

项目引用的优点是它会在生成系统中创建项目之间的依赖关系。如果自从上次生成引用项目以来改变了依赖项目,就会生成该依赖项目。文件引用不会创建生成依赖关系,所以在生成引用项目时无须生成依赖项目。但在引用项目需要输出中包含依赖项目的另一个版本时,这就会出问题。

6.6.7 Resources选项卡

通过Resources选项卡可以直接添加和删除项目资源,如图6-15所示。在图中,给应用程序添加了4个图标。资源可以是图像、文本、图标、文件或其他可以序列化的类。

图6-15

这个界面便于在设计时处理资源文件。第39章将详细讲述如何使用资源文件存储应用程序常量,以及如何生成国际化的应用程序。

6.6.8 Services选项卡

客户端应用程序服务允许基于Windows的应用程序使用Microsoft ASP.NET 2.0中引入的身份验证、角色和配置文件服务。客户端服务允许在多个基于Web和基于Windows的应用程序集中使用用户配置文件和用户管理功能。

图6-16显示了Services选项卡,它用于给Windows应用程序配置客户端应用程序服务。启用服务时,必须为每个服务指定ASP.NET服务主机的URL。它将存储在app.config文件中,支持下面的客户端服务:

Authentication:允许通过内部的Windows验证方式验证用户的身份,或者使用应用程序提供的基于窗体的定制身份验证模式来验证。

Roles:获取为通过身份验证的用户指定的角色,以允许某些用户访问应用程序的不同部分。例如,管理员用户可以访问其他管理功能。

Web Settings:在服务器上存储每个用户的应用程序设置,允许它们在多台计算机和应用程序之间共享。

图6-16

客户端应用程序服务使用提供程序模型扩展Web服务。这个服务提供程序可以脱机工作,它使用本地缓存以确保在不能使用网络连接时仍可以工作。客户端应用程序服务的详情请参见第35章。

6.6.9 Settings选项卡

项目设置可以是任意类型,它仅是一个名/值对,其中的值在运行时获得。设置可以用于整个应用程序或单个用户,如图6-17所示。设置存储在Settings.settings文件和app.config文件中。编译应用程序时,依据生成的可执行文件重命名这些文件——例如,SampleApplication.exe.config。

图6-17

应用程序级的设置在运行时是只读的,只能通过手动编辑config文件来改变它们。用户设置可以在运行时动态修改,可能给每个运行应用程序的用户保存不同的值。用户设置的默认值存储在app.config文件中,每个用户的设置存储在该用户私有数据路径下的user.config文件中。

应用程序设置和用户设置详见第37章。

6.6.10 Reference Paths选项卡(仅用于C#和F#)

Reference Paths选项卡如图6-18所示,用于指定其他目录,以搜索引用的程序集。

图6-18

添加一个程序集引用时,Visual Studio会按顺序搜索如下目录来解析该引用:

(1)项目目录。

(2)在这个Reference Paths列表中指定的目录。

(3)在Reference Manager对话框中显示文件的目录。

(4)项目的obj目录,它一般只与COM交互操作程序集相关。

6.6.11 Signing选项卡

图6-19显示了Signing选项卡,在准备部署时,它为开发人员提供了为程序集选择签名方式的功能。可以通过选择密钥文件为程序集提供签名。要创建新的密钥文件,可以在文件选择器下拉列表中选择<New …>。

图6-19

应用程序的ClickOnce部署模型会创建一个要发布到网站的应用程序。用户只需要单击一次,就可以下载和安装应用程序。由于该模型支持Internet上的部署,因此公司必须能为部署包提供签名。在Signing选项卡界面中可以指定用于签署ClickOnce清单的证书。

第47章将详细介绍程序集签名,而第49章将讨论ClickOnce部署。

6.6.12 My Extensions选项卡(仅用于Visual Basic)

My Extensions选项卡(如图6-20所示)可以添加对程序集的引用,使用扩展方法特性,以扩展Visual Basic的My名称空间。最初引入扩展方法是为了支持LINQ,并且无须对基类库进行大的修改。它们允许开发人员在已有的类中添加新方法,而无须使用继承来创建子类,或重新编译最初的类型。

图6-20

My名称空间用于提供对通用库方法的简化访问。例如,My.Application.Log提供的方法可以使用一行代码在日志文件中写入项或异常。另外,这个名称空间还适用于添加提供了有效实用功能的定制类和方法、全局状态或配置信息,或者可以供多个应用程序使用的服务。

6.6.13 Security选项卡

使用ClickOnce部署模型部署的应用程序必须运行在受限或部分信任模式下。例如,如果一个低等级权限的用户通过Internet从网站上选择了一个ClickOnce应用程序,该应用程序就只能在Internet区域定义的部分信任模式下运行。这通常意味着应用程序不能访问本地的文件系统、拥有受限的联网能力,以及不能访问其他的本地设备,如打印机、数据库和计算机端口。

Security选项卡如图6-21所示,用于判断应用程序正确运行所需的信任级别。

图6-21

修改ClickOnce应用程序所需的权限集,可以限制哪些人能够下载、安装和操作应用程序。对于大部分人来说,应指定应用程序在部分信任模式下运行,并将安全性设置为Internet区域的默认值。或者,指定应用程序需要在完全信任模式下运行,可以确保应用程序能访问所有的本地资源,但只有本地管理员有这个权限。

6.6.14 Publish选项卡

ClickOnce部署模型分为两个阶段:应用程序的初次发布和后续的更新,以及下载和安装原来的应用程序和后续的修订版本。可以在Publish选项卡中使用ClickOnce模型部署现有的应用程序,如图6-22所示。

图6-22

如果ClickOnce应用程序的安装模式被设置为从网站上下载后可脱机使用,该应用程序就会在本地计算机上安装。这会将应用程序放置在Start菜单和Add/Remove Programs列表中。在原来的网站连接可用的情况下运行应用程序,该应用程序将判断是否有可用的更新版本。如果存在更新版本,系统就会询问用户以确定是否需要安装更新版本。

ClickOnce部署模型详见第49章。

6.6.15 Code Analysis选项卡

大多数曾在团队中工作的开发人员都必须遵守一系列协定的编码标准。组织一般使用已有的标准,或者创建自己的标准。但标准只有切实地执行才是有效的,而执行标准唯一有效的方式是使用工具。过去需要使用外部实用工具。Visual Studio 2015(包括Community版的所有版本)现在可以在IDE内部进行静态代码分析。

Code Analysis选项卡如图6-23所示,可用于启用代码分析功能,作为生成过程的一部分。这是一个相当耗时的过程,所以仅包含在发布或测试生成配置中。无论是否为项目启用了代码分析功能,都可以从Build菜单手动调用该功能。

图6-23

并不是Code Analysis窗格中定义的所有规则都适合所有的组织或应用程序。这个窗格允许开发人员控制要应用的规则,它们是产生警告还是生成错误。在Rules列中取消对某规则的选择,就会禁用该规则。双击Status列中的一个单元格,就会在不符合规则时产生警告或生成错误。

第55章将介绍内置的Visual Studio Code Analysis工具。