2023年6月21日发(作者:)

Visual Studio一直是广大程序员所关注的重要的软件开发平台。目前,大家可以从微软网站下载Visual Studio 2008 bate2 版本。此次大会中,微软.NET咨询顾问周敏向大家介绍了微软Visual Studio 2008的基本情况和开发语言的增强等情况。

功能上的增强

目前,微软的Visual Studio团队、SQL Server团队、Office团队都在使用Team Foundation Server进行企业级的应用开发。Visual Studio 2008的设计目标主要有3点:提高开发效率、在开发过程生命周期中使团队成员能够更好的协作、能够开发基于微软最新技术的一些应用。Visual Studio 2008支持.NET framework 3.5,并且对以前.NET framework版本进行支持。同时,在VB3.5和C#3.5中加入了对LINQ的支持。LINQ使用户能够使用VB和C#编写出类似于SQL语句这样的指令,使得开发语言和数据库语言彼此能够结合起来。以前的SQL语言检索能力很强,但是并不擅长进行复杂的运算。现在VB和C#能够获取数据,并且能够对数据进行复杂的运算。这也是在Visual Studio 2008中引入LINQ技术的原因。

在软件过程管理中,Visual Studio 2008引入了CODE MATRIX,可以测量代码的复杂度,对代码的性能进行定量的分析,从而对代码的优劣有一个比较深入的了解。此外,在Visual Studio 2008中引入了新的负载测试的模型、界面和报表。更重要的是,还有一个连续集成的构建,例如,一个企业有一个开发主线,还有很多开发分支。假定每个开发分支都是其中的一个功能点,当功能点开发完成以后,需要合并到开发主线,在对开发主线进行合并操作的时候,Visual Studio 2008能够自动进行团队构建,并且给出构建的结果。而在Visual Studio 2005时,需要进行很多手工操作。

WPF是微软最新的表示层框架,可以使用户在开发应用程序时,所有的界面都是统一的。WPF具有非常强的3D处理效果。

语言上的增强

在Visual Studio 2008的C++语言当中,MFC可以支持Vista的通用控件。Visual Studio 2008还支持智能感应,除此以外,对于AJAX引入了很多扩展控件,从而可以快速开发 AJAX的应用。新的Vista SDK中包含大量的非托管API。UAC(用户访问控制)是Vista的一种访问控制机制,主要是防止病毒对系统的破坏。

Visual Studio 2008中的VB语言不但可以获取数据,并对数据进行复杂的运算。此外,对XML的处理也更加方便。同时,VB集成开发环境的开发效率有了大幅度提高,变得更加智能。Visual Studio 2008整合了对象、关系型数据、XML的访问方式,语言更加简洁。

高效开发

使用Visual Studio 2008可以高效开发Windows应用。设计器中可以实时反映变更,XAML中智能感知功能可以提高开发效率。同时Visual Studio 2008支持项目模板、调试器和部署程序。使用Expression交互式设计器可以无缝集成设计人员与开发人员的工作流程。

Visual Studio 2008可以高效开发Web应用,集成了 AJAX 1.0,包含 AJAX项目模板。此外,它还可以高效开发Office应用和Mobile应用。

什么是LINQ

LINQ是一种用来进行数据访问的编程模型,使得.NET语言可以直接支持数据查询。LINQ的目标是降低访问数据的复杂度。LINQ可以用统一的方法访问不同类型的数据,可以将数据作为对象使用,能够更好地与编成模型集成,可以在Visual Studio中进行智能提示。

LINQ可以为SQL Server提供对象到关系的映射。此外,LINQ可以将单个类映射到多个表或视图,可以进行存储查询和实体查询

Visual Studio 2008 可自动执行 WCF 手动任务,包括更新代理引用和消除重复任务(例如创建简单托管项目)。Visual Studio 还能解决跨目标和数据协定类型共享等一些困难问题。在本专栏中,我将逐步介绍其新功能及优势,并对其任何缺陷和解决方法做出解释。尽管我将在此使用 C# 项目设置,但除非我另行说明,否则所有设置同样适用于 Visual Basic®。

.NET Framework 跨目标

Visual Studio 的早期版本通常针对随其一起提供的 .NET Framework 版本。例如,Visual Studio 2005 只能生成针对 .NET Framework 2.0 的程序集,而此惯例并不能反映大多数开发人员所面临的真实情况。通常,开发人员需要在维护针对早期版本的 .NET 而编写的旧版应用程序的同时,还要在其新版应用程序中使用新版 Visual

Studio。

此外,此惯例还意味着开发人员在维护为早期版本的 .NET Framework 而编写的应用程序时,无法从效率增强功能(例如 Visual Studio 2005 中引入的代码重构支持)中获益。

问题在于 .NET Framework 各版本不支持跨目标功能。您要么必须安装多个版本的 Visual Studio,要么使用独立的测试和部署内部版本进行补偿。Visual Studio 2008

尝试通过为多个版本的 .NET Framework 提供充分支持(虽然不完美)来解决这一问题。由于实际上 .NET Framework 3.0 和 .NET Framework 3.5 使用的 CLR 版本与 .NET Framework 2.0 使用的相同,唯一的区别在于新引用的程序集,因此 Visual

Studio 仍可针对相同运行库,而为 .NET Framework 版本 2.0、3.0 和 3.5(其中 .NET Framework 版本号对应的是发行版本,而不是运行库版本,运行库版本仍为

CLR 2.0)提供跨目标功能。

在 Visual Studio 2008 中,“Properties”(项目)的“Application”(应用程序)窗格包含一个称为“Target Framework”(目标框架)的新组合框,通过该组合框您就可以针对 .NET Framework 版本 2.0、3.0 和 3.5(参见图 1)。

图 1Visual Studio 2008 中的目标框架属性 (单击该图像获得较小视图)

图 1

Visual Studio 2008 中的目标框架属性 (单击该图像获得较大视图)

Target Framework 值仅在开发时有效,而在运行时无效(您的程序集仍指向 .NET 2.0 CLR)。您选择的值表示您构建程序集时可针对的 .NET Framework 的最早版本。新项目默认被配置为针对 .NET Framework 3.5。如果添加引用,则会变得有些复杂;如果在引用较高版本程序集时,降低 Target Framework 版本,Visual

Studio 2008 将提示您引用出错和内部版本失败。Visual Studio 2008 不允许您向其所需 Framework 版本高于现有项目的 .NET Framework 程序集添加引用。如果您向版本更高的同一解决方案中的其他项目添加引用,Visual Studio 2008 将警告您可能会发生冲突。如果通过浏览程序集来添加引用,Visual Studio 2008 将不会干预您进行操作。

在语言和跨目标方面,请注意,您可以在 C# 中(而不是 Visual Basic 中),通过限制编译器版本来限制使用 .NET Framework 2.0 或 3.0 项目中诸如匿名类型和扩展方法等功能。您可以转至“Build”(内部版本)窗格,然后单击“Advanced”(高级)按钮,并选择“ISO-2 (C# 2.0)”作为语言版本(而不是尚未标准化的默认版本)来执行此操作。

在 Visual Studio 2008 中打开 Visual Studio 2005 WCF 项目时,升级过程中框架版本保持为 2.0。实际上这可以正常运行(请记住,基础运行库版本并未改变),但我建议根据需要手动将其设置为版本 3.0 或 3.5。

使用新项目模板时,Target Framework 版本是最重要的因素。WCF 工作流和整合项目必须针对 .NET Framework 3.5 进行构建;Service Library 项目要求针对 .NET Framework 3.0 或 3.5。“Add Service Reference”(添加服务引用)功能仅当为项目选择 Framework 版本 3.0 或 3.5 时可用,本专栏稍后将介绍此功能。

WCF 提供的主机

Visual Studio 2008 附带了一款名为 的现成的通用服务主机。它位于 C:Program FilesMicrosoft Visual Studio 9.0Common7IDE 中。为了方便使用,我建议将该位置添加到系统的 Path 变量中。WcfSvcHost 是一种简单的命令行实用工具,可接受两个参数:一个是指向包含一个或多个服务类的 .NET 程序集的文件路径,另一个是指向托管 .config 文件的文件路径。例如:

/service: /config:

指定的服务程序集可以是类库程序集 (DLL),也可以是应用程序程序集 (EXE)。WcfSvcHost 将启动一个新进程,该进程将自动托管指定 .config 文件的服务部分中列出的所有服务类。请注意,这些服务类及其服务约定和数据协定不必是公共类型,可以是内部类型。此外,自动托管的服务不需要提供任何元数据,但是它们可以发布元数据(如果选择发布)。

WcfSvcHost 是一种以桌面任务栏图标驻留的 Windows 窗体应用程序。若要关闭主机,只需从任务栏图标上下文菜单中选择“Exit”(退出)即可。使用这种方式终止托管不太妥当,因为 WcfSvcHost 将中止当前正在进行的所有调用,客户端很可能会收到异常。如果单击 WcfSvcHost 任务栏图标,将出现一个对话框,其中列出托管的所有服务(参见图 2)。

图 2WcfSvcHost 服务列表 (单击该图像获得较小视图)

图 2

WcfSvcHost 服务列表 (单击该图像获得较大视图)

该对话框还显示服务的状态及其元数据地址,您可以将这些信息复制到剪贴板,稍后向服务添加引用时可能会用得到。关闭 WcfSvcHost UI 只是将其折叠回任务栏。

WcfSvcHost 的目的就是在开发过程中不再需要使用独立托管程序集来配合服务库。诸如托管项目等的开发工作是一种重复任务,这些主机通常包含大量相同的代码行,当有多个服务库时,这些重复代码容易导致解决方案变得臃肿。为了便于开发和测试,可以将 WcfSvcHost 直接集成到您的 Visual Studio 2008 服务库项目中。在项目属性的“Debug”(调试)窗格中,将 指定为要启动的外部程序,然后将您的类库名及其 .config 文件(自动生成并自动复制到 bin 文件夹)指定为参数。

完成后,当您运行类库(完成上述操作后才能执行运行)时,它将借助该进程附带的调试器由 WcfSvcHost 自动托管。停止调试时,Visual Studio 2008 将以不妥当的方式中止托管。

您甚至可以在 .NET Framework 3.0 应用程序中与 Visual Studio 2005 项目一起使用 WcfSvcHost,由于 WcfSvcHost 只需要 .NET Framework 3.0,因此只需从安装了 Visual Studio 2008 的计算机上复制 WcfSvcHost 即可。为了使用更加方便,建议您将 WcfSvcHost 添加到 .NET Framework 3.0 计算机上的全局程序集缓存 (GAC) 中。

WcfSvcHost 的最后一个功能是能够自动启动客户端应用程序,甚至能够为客户端提供特定于该应用程序的可选参数:

/service: /config:

/client: /clientArgs:123,ABC

此功能对于在自动测试、甚至是简单部署的情况下启动主机和客户端非常有用。

WcfSvcHost 的最大缺陷是只适用于简单情况,例如在打开主机实例之前无需以编程方式访问主机实例的情况,或在其打开之后以编程方式访问其事件模型的情况。与使用 IIS 或 Windows Activation Service (WAS) 进行托管不同,WcfSvcHost 没有对等的服务主机工厂支持。因此,不具备动态添加基址、配置终结点、中止调用以及在主机级别配置自定义行为等功能。通过我对 WCF 的使用体验发现,除了最简单的情况之外,所有其他情况中最终都需要以编程方式访问主机实例,因此我并不将

WcfSvcHost 视为一种成熟、高效的主机,而我自己执行 WAS 或进行专用自托管。

WCF 提供的测试客户端

除服务主机外,Visual Studio 2008 还随附了一个用于进行基本测试的简单通用的测试客户端,您可以使用它调用大多数服务上的操作。正常安装后,测试客户端

位于 , is found after normal installation

at C:Program FilesMicrosoft Visual Studio 9.0Common7IDE 下。您必须为

WcfTestClient 提供一个命令行参数,其中包含要测试的服务的元数据地址:

localhost:9000/

您可以指定任何元数据地址,例如 HTTP-GET 或者 HTTP、TCP 或 IPC(命名管道)上的元数据终结点。也可以指定多个元数据地址:

localhost:8000/ ://localhost:9000/MEX

WcfTestClient 是一个 Windows Forms 3.5 应用程序(参见图 3)。在此图中,左侧的树控件包含测试的服务及其终结点。您可以详细查看某个终结点的约定并选择某项操作。特定于该调用的信息将显示在右侧窗格的选项卡中。图 4 所示为一个简单约定及其实现的示例。 图 3使用 WcfTestClient (单击该图像获得较小视图)

图 3

使用 WcfTestClient (单击该图像获得较大视图)

您可以在方法选项卡的“Request”(请求)部分中输入作为操作参数的一个整数和一个字符串,如图 3 所示。单击“Invoke”(调用)按钮时,它将向服务调度调用,并在“Response”(响应)中显示返回值或输出参数。如果是单向操作,WcfTestClient 将在消息框中通知您已成功调度此操作。如果出现异常,WcfTestClient 将在消息框中显示异常信息,并让您发出其他调用。

WcfTestClient 不使用测试服务来维护传输层会话(或任何其他会话)。所有调用均在新代理实例上进行。此外,所有调用均异步进行,这样 UI 能随时进行响应。但是,尽管是异步调用,WcfTestClient 只允许一次调度一个调用。

WcfTestClient 从代理文件(包括 .config 文件)以静默方式创建程序集,然后从临时位置加载该程序集。如果单击树中的“Config File”(配置文件)项,您可以获取该 .config 文件(添加服务引用时生成的同一 .config 文件),并可以将其显示其选项卡中。

与早期的 Visual Studio ASMX Web 服务测试页不同,通过 WcfTestClient 您可以借助枚举、类或结构(每个类或结构都是其他类或结构的组成部分)等复合参数、甚至是参数集合和参数数组来调用操作。只需展开“Request”(请求)部分中的项,从下拉列表中设置其值(例如枚举值),并进行调用即可。如果操作接受集合或数组,您还需要设置其长度。例如,图 5 显示了以下操作的结果请求和响应: 图 5指定数组长度和值 (单击该图像获得较小视图)

图 5

指定数组长度和值 (单击该图像获得较大视图)

[OperationContract]

bool ProcessNumbers(int[] numbers]

类似地,“Response”(响应)窗格将包含所有返回的复合值或输出参数。这样我们发现了 WcfTestClient 的一个缺陷:为了指定要测试的不同服务,您必须先关闭,并在更改命令行参数后重新启动 WcfTestClient。如果能同时在 GUI 中提供服务地址,则可能会很好地缓解这个问题。

您可以直接将 WcfTestClient 集成到您的 Visual Studio 2008 解决方案中。首先,将类库项目添加到解决方案,并删除所有引用、文件夹和源文件(因为您不需要这些项)。然后,将 设置为外部启动程序,并提供一个或多个测试服务的一个或多个元数据地址,例如 IIS 或 WAS 托管项目的 .svc 地址,或者就此而言,解决方案内部或外部主机项目的任何其他元数据地址。

请注意,如果计算机上只安装了 .NET Framework 3.0,则您不能在其上使用

WcfTestClient,因为 WcfTestClient 需要使用内部 .NET Framework 3.5 树网格控件(用于表示复合参数的控件)。

当然,您可以在一个步骤中结合 WcfTestClient 和 WcfSvcHost,这样即可自动托管服务库中的服务并对其进行测试:

/service: /config:

/client:

/clientArgs:localhost:9000/

但是,可以使用 WcfSvcHost 指定元数据参数。默认情况下,WcfSvcHost 将向指定客户端应用程序传送它在服务 .config 文件中找到的元数据地址。仅当服务未提供自己的元数据或您希望测试客户端使用其他地址时,才应显式指定元数据地址。此外,如果服务 .config 文件包含给定服务的多个元数据终结点,则这些终结点将按以下优先顺序提供:HTTP、TCP、IPC 和 HTTP-GET。您可以在 Visual Studio 2008 中合并这些步骤以进行无缝托管和测试体验。将 指定为启动程序,并将 .config 文件和 指定为客户端。

WCF 服务库

作为 Target Framework 的一项功能,Visual Studio 2008 提供了多个新的

WCF 项目模板。通过“New Project”(新建项目)对话框中的组合框,您可以指定 Target

Framework 的版本(2.0、3.0 或 3.5),如图 6 所示。

图 6WCF 项目模板 (单击该图像获得较小视图)

图 6

WCF 项目模板 (单击该图像获得较大视图)

如果选择 Framework 2.0,则没有任何新模板可用。Framework 3.0 中提供了一个称为 WCF 服务库的新项目模板。此项目类型只是 WcfSvcHost 和

WcfTestClient 的预构建用法,与我前面提到的技术(将两者合二为一)非常类似。请注意,使用 WCF 服务库模板,就不需要将 指定为启动程序或 .config 文件,因为项目文件包含适用于 WCF 服务库的新 ProjectTypeGuids 元素。

但是该模板有一个负面影响:停止调试程序不会终止测试客户端;时间久了,您的桌面会由于孤立客户端而变得杂乱。要解决此问题,只需还原到前面清晰介绍的手动步骤。

WCF 服务库还提供了一个用于服务约定、服务约定的实施及匹配的 .config 文件的简单模板。 利用聚合服务库,您可以通过 WCF 终结点实现 RSS 源,并且可以从返回源的简单服务约定、服务约定的实施及匹配的 .config 文件着手操作。您可以托管和显示自己的源,与托管和显示任何其他服务一样。聚合终结点使用新的 WebHttpBinding 绑定。此新绑定旨在用于接收 Web 请求,而不能用于常规服务调用。

使用“顺序工作流服务库”模板,您可以将终结点的约定操作作为工作流活动来实现,或者将工作流显示为服务。项目将包含一个用于实现简单约定和匹配的 .config 文件的顺序活动。尽管客户端也将与类似传统终结点的终结点进行交互,但其实现完全是工作流驱动的。

“状态机工作流服务库”模板使用状态机而不是顺序工作流来实施其操作(触发状态转换)。工作流项目模板使用 WcfSvcHost 和 WcfTestClient,如同普通 WCF 服务库那样。工作流模板还使用新的上下文绑定对工作流实例 ID 的传递进行管理,从而支持持续工作流。我将在以后的专栏中详细介绍这些绑定。

添加服务引用

Visual Studio 2005 extensions for .NET Framework 3.0 提供了一项用于向

WCF 服务添加引用的基本功能,而不具有 SvcUtil 的许多高级功能。Visual Studio

2008 具有一个新的服务引用对话框,如图 7 所示。

图 7“添加服务引用”对话框 (单击该图像获得较小视图)

图 7

“添加服务引用”对话框 (单击该图像获得较大视图)

您可以在任何项目中打开此新对话框,方法是:右键单击解决方案资源管理器中项目内的任意位置,然后从上下文菜单中选择“Add Service Reference”(添加服务引用)。请注意,必须将项目配置为针对 .NET Framework 3.0(及更高版本)才能启用此选项。

在“Add Service Reference”(添加服务引用)对话框中,首先需要指定服务元数据地址(不是服务 URL,如对话框中所述),然后单击“Go”(执行)查看可用服务终结点(不是服务,如标记所示)。必须指定命名空间(如 MyService)才能包含生成的代理,然后单击“OK”(确定)生成代理并更新 .config 文件。请注意,在多数情况下,Visual Studio 2008 不是足够的智能来推断最清楚的绑定值,因此,它将通过声明绑定的所有默认值来删除 .config 文件。Visual Studio 的未来版本中将会解决此问题。如果您关注对 .config 文件的维护,请先打开 .config 文件,再添加引用,然后执行一次撤消 (Ctrl+Z) 操作,最后手动将 .config 文件条目添加到客户端部分中。

只要 WCF 服务位于网站项目或某个新 WCF 服务库中,您就可以使用“Discover”(搜索)按钮在自己的解决方案中查找这些服务。如果位于网站项目中,Visual

Studio 2008 将检索 IIS 中的元数据或启动基于文件系统的 开发服务器。如果位于 WCF 服务库中,则 WCF 将自动启动其主机 (WcfSvcHost) 以便获取元数据。

可以通过“Advanced”(高级)按钮打开设置对话框,从而调整代理生成,如同使用 SvcUtil(参见图 8)一样。通过使用更直观的选项,您可以配置生成的代理和约定(公共或内部)的可见性;可以为数据类型生成适用于高级互操作方案的消息约定,在此方案中必须遵从现有消息格式(通常为自定义),并可以单击“Add Web Reference”(添加 Web 引用)按钮将引用转换为旧 ASMX Web 服务引用。 图 8服务引用高级选项 (单击该图像获得较小视图)

图 8

服务引用高级选项 (单击该图像获得较大视图)

“Generate asynchronous operations”(生成异步操作)复选框可以为导入的约定中的每个操作添加一对匹配的 Begin 和 End 元素,这两个元素允许客户端在工作线程中异步发出调用,并且通过提供完成回调方法或阻止完成来允许客户端稍后与操作完成进行同步。例如,假设约定的定义如下

[ServiceContract]

interface ICalculator

{

[OperationContract]

int Add(int number1,int number2);

}

则导入的约定将如图 9 所示。

异步调用的匹配客户端代码将类似于如下所示:

CalculatorClient proxy = new CalculatorClient();

int sum;

AsyncCallback completion = (result)=>

{

sum = (result);

(sum == 5);

();

};

dd(2,3,completion,null);

虽然您可以按原样使用这些方法,但是提供给 Begin 的完成回调是从线程池中的线程调用的。如果使用回调访问某些与特定线程相关联的资源,则这样做会出现严重问题。Windows 窗体(或 WPF)应用程序即为典型示例,此应用程序异步调度较长的服务调用(避免阻止 UI),然后希望使用调用结果来更新 UI。不允许使用原始 Begin 进行更新,因为只允许 UI 线程更新 UI。为了更好地处理此情况,已用受保护的 InvokeAsync 方法扩展了 ClientBase 基类,该方法可以获取客户端的同步上下文并将其用于调用完成回调,如图 10 所示。

ClientBase 还提供了一个事件参数帮助器类和两个用于启动和结束异步调用的专用委托。生成的代理类由 ClientBase 派生而来,此代理类将使用这些基本功能。代理将具有一个 Completed 公共事件(该事件使用特定于异步方法结果的强类型事件参数类)和两个 Async 方法(用于异步调度调用):

partial class AddCompletedEventArgs : AsyncCompletedEventArgs

{

public int Result

{get;}

}

class CalculatorClient : ClientBase,ICalculator

{

public event EventHandler AddCompleted; public void AddAsync(int number1,int number2,object userState);

public void AddAsync(int number1,int number2);

//Rest of the proxy

}

客户端还可以为 Completed 事件订阅事件处理程序,以便在完成时调用此事件处理程序。使用 Async 与 Begin 的主要差别在于:Async 方法获取客户端的同步上下文,并在该同步上下文中激发

Completed 事件,如图 11 所示。

通过“Collection”(集合)类型组合框,您可以指定如何向客户端显示在服务元数据中找到的某些类型的集合和数组。例如,如果服务操作返回 IEnumerable、IList 或 ICollection 集合中的某一个,则默认情况下代理会将其显示为数组。例如,以下服务端操作

[OperationContract]

IEnumerable GetNumbers();

将在代理上表示为:

[OperationContract]

int[] GetNumbers();

但是,您可以请求 Visual Studio 2008 使用其他集合(例如用于进行数据绑定的

BindingList、List、Collection 和 LinkedList 等)。如果可以进行转换,代理将使用请求的集合类型而不是数组,如下所示:

[OperationContract]

List GetNumbers();

字典也具有类似功能。通常情况下,如果服务操作返回可序列化的字典,如下所示

[Serializable]

class MyDictionary : IDictionary

{...}

[OperationContract]

MyDictionary GetDictionary();

代理类随后会将该字典表示为 Dictionary,这是以下 Dictionary 集合类型组合框的默认值:

[OperationContract]

Dictionary GetDictionary();

但是,您可以请求其他字典类型(如 SortedDictionary、HashTable 或

ListDictionary),代理将改为使用这些字典(如果可能):

[OperationContract]

SortedDictionary GetDictionary();

综上所述,新服务引用最重要的功能就是能够在程序集之间共享数据协定类型。使用 Visual Studio 2005,如果客户端将服务引用添加到两个支持相同数据协定的独立服务中,那么客户端将获得两个类型完全相同(表示相同数据协定)的不同服务引用。使用 Visual Studio 2008,默认情况下,如果客户端引用的任何程序集所具有的数据协定类型与引用服务的元数据中显示的数据协定类型相匹配,则 Visual Studio 2008

将不会再次导入该类型。有必要再次强调一下,现有数据协定引用必须位于另一个引用程序集中,而不是位于客户端项目本身中。Visual Studio 的未来版本中可能会解决此限制。目前,解决方法和最佳实践都很明显:将所有共享数据协定都构建到指定的类库中,并让所有客户端都引用该程序集。 通过服务引用的高级设置对话框,您可以配置数据协定共享。默认情况下“Reuse

types in the referenced assemblies”(重用引用程序集中的类型)复选框处于选中状态,但您可以关闭此功能。不管复选框的名称是什么,此复选框都将只能共享数据协定而不能共享服务约定。使用复选框下面的单选按钮(参见图 8),还可以指示 Visual

Studio 2008 在所有引用的程序集中重用数据协定,或者通过选中列表中的特定程序集来限制共享这些程序集。

添加引用后,项目将具有一个新文件夹 Service References,该文件夹中显示了每个引用的服务的服务引用项(参见图 12)。

图 12

服务引用文件夹

随时可以右键单击引用并选择“Update Service Reference”(更新服务引用)来重新生成代理并更新客户端的 .config 文件。由于服务引用项中还包含一个记录了所使用的原始元数据地址的文件,因此可以执行此操作。

还可以选择“Configure Service Reference”(配置服务引用)打开一个对话框,该对话框与添加引用时使用的高级设置对话框类似。通过配置服务引用对话框,您可以更改服务元数据地址以及其他高级代理设置。

微软公司计划添加Windows Live应用程序的功能到Visual Studio开发工具包中,这样程序员就能以最快速度开发出有关于Live网络服务平台的应用.

公司计划在Visual Studio 2008中正式实施这一捆绑战略,目前他们正在进行技术测试,包括目前的2005版本,Beta版本将在10-11月发布.

Windows Live是微软一系列网络服务的名字,包括搜索,即时通信,E-Mail,Blog和图像共享等,此前,Windows Live具有一系列的SDK,但将它整合到开发工具还是第一次.

最让程序员激动的是,Windows Live的周边开发是有回报的,程序员将得到微软的分红,大约0.25美元每独立用户,对于Live应用集中的程序来说,还是非常诱人的.

10个C#编程和Visual Studio使用技巧

2010-09-28 08:52 黄永兵 译 我要评论()

C#是一门伟大的编程语言,与C++和Java相比,它的语法更简单,相对来说更好入门。Visual

Studio作为.Net平台上最重量级的IDE,也通过不断的更新为开发者带来更出色的开发体验。本文将介绍10个C#编程和Visual Studio IDE使用技巧。

C#是一门伟大的编程语言,与C++和Java相比,它的语法更简单,相对来说更好入门,经历10年的发展,C#已经成为编程语言领域强有力的竞争者,每一年我们都能看到它的进步,每一个新版本都加入了许多新特性,总的来说,作为一门编程语言,它没有让C#开发者社区失望。Visual Studio亦是如此,新版本的Visual Studio 2010所带来的新特性也让开发者们兴奋不已。本文下篇请点击这里。

对开场白没兴趣?好吧,我们直接切入正题,下面介绍10个C#编程和Visual Studio IDE使用技巧。

1、e

你是否知道这个属性是与平台无关的?允许你根据每个平台输出新的换行字符。

1. ine("My Tips On ,{0}C#", e);

2、命名空间别名

你是否知道可以使用更短的别名代替长的命名空间?你是否遇到过需要限制完整的命名空间以避免产生歧义?看下面的代码示例,它是使用扩展的.NET Framework控件创建的一个通用库。

2.

3.

4.

5.

using trols;

using ntrols;

/* Assuming that you had a Text Box control in both the namespace,

6.

7.

8.

you would have to fully qualify the class object with the

complete avoid that, you can use namespace alias.

Change as below */ 9.

10.

11.

12.

13.

14.

using trols;

using mc = ntrols;

/*and then use, /*

x textbox = new x();

3、DebuggerBrowsable属性

每个C#开发人员应该都有过程序调试的经历,这个属性在调试期间控制对象行为的能力非常强大,在调试过程中它在一个小提示窗口中显示对象,它可以用于隐藏私有成员或在调试窗口中显示也是多余的成员,例如,当你调试类对象时,在调试窗口中你可以看到私有变量,这个时候你就可以使用[DebuggerBrowsable()]属性来隐藏它们,下面是可见的代码。

15.

16.

17.

18.

19.

20.

21.

22.

23.

24.

public class MyClass

{

private string _id;

public string InternalID

{

get { return _id; }

set { _id = value; }

}

}

下面是使之隐藏的代码:

25.

26.

27.

28.

29.

30.

31.

32.

33.

34.

35.

[DebuggerBrowsable()]

public class MyClass

{

private string _id;

public string InternalID

{

get { return _id; }

set { _id = value; }

}

}

4、DebuggerDisplay属性 这个属性可让具有可读描述的变量对象显示出来,它有助于提供团队其它成员未来阅读代码的效率,它的用法也是非常简单的,下面的代码示例显示了变量的值。

36.

37.

38.

39.

40.

public class MyClass

{

[DebuggerDisplay("Value = {myVariable}")]

public string myVariable = "mydisplay";

}

5、为项目创建虚拟目录

你可以强制每个开发人员在本地为项目创建一个同名的虚拟目录,这个来自Visual

Studio IDE的技巧将有助于代码在多个C#开发人员的电脑之间同步。在项目名称上点击右键,选择“属性”,在“Web”选项卡中,选中“使用本地IIS Web服务器”选项,然后为其指定一个虚拟路径,如下图所示。

图 1 设置项目的本地虚拟目录路径

这样设置后,所有使用该项目文件的开发人员都会收到一个要求,在本地机器上创建一个同名的虚拟目录。

6、改变项目平台

你可以改变应用程序的生成目标平台,这里的平台指的是32位和64位环境,在项目名称上点击右键,选择“属性”,在“Build”选项卡中,选择需要的目标平台,如下图所示。

图 2 修改项目的目标平台

7、代码定义窗口

这个窗口允许你跳转到对象的定义,你可以按F12键快速跳转到对象的定义位置,在代码编辑器的任意对象上试试这个功能,相信一定不会让你失望的。此外,还有一个专门的代码定义窗口,当你按照Ctrl+W,D组合键时就会弹出一个代码定义窗口。

41.

42.

43.

44.

if (pe == )

{

//Your code here.

}

如果你将光标停留在ListItemType上面,然后按下组合键,你将会看到如下图所示的一个窗口。

图 3 代码定义窗口

8、Null合并运算符

Null合并运算符允许你以很简洁的方式比较空值,它使用两个问号表示。例如,myfunction返回的值可能是一个空的整数值,在这种情况下,你可以使用合并运算符快速检查它是否为空,然后返回一个代替值。

45.

46.

int myExpectedValueIfNull = 10;

int expectedValue = myfunction() ?? myExpectedValueIfNull

9、using语句快捷键

按下Ctrl+.会弹出一列可用的using语句,使用箭头键进行移动,按下回车键确认选择,如下图所示。

图 4 在代码编辑器中快速调出using语句

10、寻找恐怖的数据集合并错误根本原因

你是否遇到过无法找出数据集合并错误的原因?现在有办法了,使用try-catch将你的代码包围起来,最好是在异常处理块中观察特定代码的输出,可以准确捕捉到合并失败的原因。

47.

48.

StringBuilder error Messages = new StringBuilder();

try 49.

50.

51.

52.

53.

54.

55.

56.

57.

58.

59.

60.

61.

{

DataSet dataSet1 = populateDataSet(1);

DataSet dataSet2 = populateDataSet(2);

(dataset2);

}

catch (ception de)

{

foreach (DataTable myTable in )

{

foreach (DataRow myRow in ors())

{

foreach (DataColumn myColumn in umnsInError())

62.

63.

{

//loop through each column in the row that has caused the error

64.

65.

66.

//during the bind and show it.

error Messages .Append((

"Merge failed due to : {0}", umnError(myColumn)));

67.

68.

69.

70.

}

}

}

}

小结

希望你能灵活运用这些C#编程和Visual Studio技巧,享受写代码的乐趣,如果你有其它技巧愿意和大家分享,欢迎在本文后面发表评论

升级到Visual Studio 2008的10个技巧 收藏

来源:InfoQ

升级到Visual Studio 2008,来个飞跃。Visual Studio 2008最近发布了,开发者经常希望自己成为安装他们最青睐开发工具最新版本的第一人。但是,若在升级过程中做出了错误的选择的话,就会为之付出一些代价。由于Jon Galloway等人,确保了升级过程是一个平稳的过程,而且只有十步之遥。

1. 首先,小心的卸载所有先前发布的相应软件和模块

这是最重要的步骤之一。如果您有任何先前版本的.NET Framework 3.5或Visual Studio 2008,那么这些软件都必须在安装Visual Studio 2008 RTM之前被卸载。在安装之前关闭一些相关的软件也是个不错的主意:

关闭所有的MS Office应用程序(如Outlook,Word等)

关闭Internet Explorer

关闭所有的windows资源管理器

关闭所有其它不需要打开的程序

以下是Scott Guthrie 提供的对先前发布版本的合适的卸载顺序,这些提到的软件可能有些您安装了而有些没有,只要确保如下的顺序即可:

移除“MSDN Library for Visual Studio 2008 Beta”

移除“Microsoft SQL Server Compact Edition 3.5”

移除“Microsoft SQL Server Compact Edition 3.5 Design Tools”

移除“Microsoft SQL Server Compact Edition 3.5 for Devices”

移除“Microsoft Visual Studio Performance Collection Tools”

移除“Windows Mobile 5.0 SDK R2 for Pocket PC”

移除“Windows Mobile 5.0 SDK R2 for Smartphone”

移除“Crystal Reports 2007”

移除“Visual Studio Asset System”

移除“Microsoft Visual Studio Web Authoring Component / Microsoft Web Designer Tools”

移除“Microsoft Visual Studio 2005 Tools for the 2007 Microsoft Office System Runtime”

移除“Microsoft Visual Studio 2005 Tools for the 2007 Microsoft Office System Runtime

Language Pack” (只针对非英语版)

移除“Microsoft Visual Studio Tools for Office Runtime 3.0”

移除“Microsoft Document Explorer”

移除“Microsoft Document Explorer 2005 Language Pack” (只针对非英语版)

移除“Microsoft Device Emulator 3.0”

移除“Microsoft .NET Compact Framework 3.5”

移除“Microsoft .NET Compact Framework 2.0 SP1”

移除“.NET Framework 2.0 SDK”

移除“Microsoft Visual Studio Codename Orcas Remote Debugger”

移除“Microsoft Visual Studio 64bit Prerequisites Beta” (只针对64位平台)

移除“Microsoft .NET Framework 3.5"

2. 只安装您真正会用到的部分

不要仅仅因为DVD上什么都有,就要把所有的东西都装上。您安装的软件越少,以后打的补丁就越少,其占用的磁盘空间也越少。

3. 不要被前面的重启提示弄傻了

.NET Framework 3.5的安装程序会提示用户在安装的过程中间重启,不要理会它。所有的重启都要等到安装完Visual Studio 2008之后再执行。

4. 如果您要用Team System,就安装Team System 2008 Team Explorer

如果您准备连接到Team Foundation服务器,那么您需要安装Team System 2008 Team

Explorer,否则无法连接到Team Foundation服务器。

这篇文档告诉您如何从Team Foundation服务器安装介质(光盘,下载包等)得到Team

Explorer,但是这是一个3GB的下载版本。最简单的方法是得到单独的Team Explorer安装版,这个安装版只有387MB。

5. 安装之后,将您的IDE设置恢复到默认设置。

如果IDE的设置在任何先前发布的版本中做了更改,它们都应该被恢复到默认设置。可以在命令行运行 /ResetSettings 或者在Visual Studio 2008中点击菜单 Tools

> Import and > Reset all settings

6. 抓住这个时机改变您的Visual Studio主题

这是个很好的时机来修改主题。Visual Studio的主题系统允许开发者尝试一个新的主题,如果他们不喜欢,还可以改。我们推荐您选择一个使视觉更舒适的主题,特别是如果您每个星期要在IDE环境下工作很多个小时的话。

7. ListView中的Breaking changes (Breaking changes 意味着新的版本在这些地方将不再保证向前兼容,从而导致同样的代码在不同的版本中有不同的行为,或者旧的代码在新版本环境中不再支持)

Jon Galloway指出了这个非常重要的一点:

如果您使用先前发布的 ListView写过任何代码,您需要升级您的标签。事实上这里只有一个真正的区别,这个区别会带来一些不同的影响:容器元素被asp:PlaceHolder控件代替了。先前的版本允许您使用任何 runat="server" 标记做为一个容器元素。我更喜欢RTM的行为-旧的方式有时候有点太神奇,它根据ID用子元素填满父元素。新的用法更加直接,而且这种用法使得ListView中被标记的内容和被替代的内容一目了然。

具体而言,以前使用元素ItemContainer的地方,现在要用一个叫做ItemPlaceholder的占位符来代替。如果这样出错了,您会得到如下的出错信息:

An item placeholder must be specified on ListView ‘SampleListView′. Specify an item

placeholder by setting a control’s ID property to “itemPlaceholder”. The item placeholder control

must also specify runat=”server”.

8. LINQ-to-SQL 中的Breaking changes

任何先前版本的LINQ-to-SQL代码都需要被依照以下的说明更新。

把 Add 和 AddAll 方法改成 InsertOnSubmit 和 InsertAllOnSubmit. 把 Remove 和 RemoveAll 改成 DeleteOnSubmit 和 DeleteAllOnSubmit.

通过如下更改把 .dbml 文件的编码格式改为 utf-8

<?xml version="1.0" encoding="utf-16"?>

修改为

修改中如下一行(注意版本号的区别):

<add assembly="tExtensions, Version=2.0.0.0, Culture=neutral,

PublicKeyToken=B77A5C561934E089"/>

修改为

<add assembly="tExtensions, Version=3.5.0.0, Culture=neutral,

PublicKeyToken=B77A5C561934E089"/>

9. 下载更新过的Microsoft Silverlight 1.1 Tools Alpha for Visual Studio 2008

装载Visual Studio 2008时这些工具不会自动准备好。所以如果要做与Silverlight 1.1相关的开发,就得自己把它们弄过来。

10. 把您的解决方案都升级为Visual Studio 2008的格式

这是一个节省您很多时间的相当大的一个问题。由于Visual Studio 2008的解决方案文件和工程文件使用了一种新的格式,用Visual Studio 2008打开这些解决方案和工程会把它们升级。如果需要升级的工程很多,在命令行运行 /Upgrade 命令可以加快升级速度。

这些技巧可以帮助开发者在初试Visual Studio 2008的时候一切顺利。更多有关Visual

Studio 2008的信息可以在微软公司的 MSDN 网站和Scott Guthrie的blog上找到。

本文来自CSDN博客,转载请标明出处:/tongdoudpj/archive/2007/12/05/

安装问题

控件工具箱是空的: 我们看到几个人遇上了这样一个情况,当他们在VS 2008中创建一个网站或web应用时,他们发现控件工具箱是空的,源码视图也不提供intellisense。这个问题表明, 由于机器上已经安装的一些.NET框架热补(Hotfixes)的干扰,.NET 3.5版本的没有被正确地安装在机器上。这篇博客贴子描述了如何解决这个问题的方案。

JavaScript Intellisense和加彩没有被启用: 我们看到几个人遇上了这样一个情况,由于安装时一个注册表设置没有被正确配置,JavaScript代码加彩和intellisense没有被启用。这篇博客贴子描述了如何解决这个问题的方案。

安装程序在Windows Vista上要求Windows XP SP2版本: 我们看到几个人在Windows Vista上遇上了问题,VS 2008或者.NET框架3.5的Beta2向用户显示错误信息,要求他们安装Windows XP SP2(尽管他们在运行Vista!)。这篇博客贴子描述了解决这个问题的一个替代方案。

DevEnv /resetsettings: 如果你曾在机器上安装过早期版本的Orcas或VS

2008的话(Beta1或某个CTP版本),你需要在安装Beta2后重新设定VS 2008设置。如果你不这么做的话,有些设置会非常奇怪(一些窗口在出现在奇怪的地方),你也有可能看到一些IDE性能问题。你可以在命令行上对VS 2008的IDE版本键入“DevEnv /resetsettings”来重新设定你的设置。我曾在Beta 2发布贴子里对此有所讨论。

部分信任(Partial Trust)政策中的.NET 3.5网站和LINQ to SQL: LINQ和LINQ to SQL程序集默认的信任政策,以及.NET 3.5 网站的文件不允许应用在中等信任(medium trust)环境里运行。如果你把应用部署到远程主机上,你会受到影响。这篇博客贴子描述了如何在Beta2中解决这个问题的方案(在最终版中你不需要采取这些步骤)。

AJAX 多定向问题

: 就象我在原先的Beta 2发布博客贴子里提到的那样,就在发布Beta 2之前,我们发现了 AJAX 的一个并行安装的问题。你需要确认在安装VS 2008之后,运行DisableAjaxPolicy脚本来更正这个问题(运行只需几秒钟)。

VS 2008中的 AJAX 的多定向: 你可以使用Visual Studio 2008来构建针对.NET 2.0和 AJAX 1.0或者针对.NET 3.5和 AJAX 3.5的 AJAX应用。我在《.NET 3.5 和VS 2008中的 AJAX》博客贴子里,对此做了讨论。因为上面这个 DisableAjaxPolicy补丁,用VS 2008开发的针对 AJAX 1.0的应用在Beta 2中工作起来并不象我们想要的那样顺利。这篇《使用VS 2008开发针对 AJAX 1.0的应用》博客贴子讨论了在Beta 2中实现这个目的的最佳方式。

2023年6月21日发(作者:)

Visual Studio一直是广大程序员所关注的重要的软件开发平台。目前,大家可以从微软网站下载Visual Studio 2008 bate2 版本。此次大会中,微软.NET咨询顾问周敏向大家介绍了微软Visual Studio 2008的基本情况和开发语言的增强等情况。

功能上的增强

目前,微软的Visual Studio团队、SQL Server团队、Office团队都在使用Team Foundation Server进行企业级的应用开发。Visual Studio 2008的设计目标主要有3点:提高开发效率、在开发过程生命周期中使团队成员能够更好的协作、能够开发基于微软最新技术的一些应用。Visual Studio 2008支持.NET framework 3.5,并且对以前.NET framework版本进行支持。同时,在VB3.5和C#3.5中加入了对LINQ的支持。LINQ使用户能够使用VB和C#编写出类似于SQL语句这样的指令,使得开发语言和数据库语言彼此能够结合起来。以前的SQL语言检索能力很强,但是并不擅长进行复杂的运算。现在VB和C#能够获取数据,并且能够对数据进行复杂的运算。这也是在Visual Studio 2008中引入LINQ技术的原因。

在软件过程管理中,Visual Studio 2008引入了CODE MATRIX,可以测量代码的复杂度,对代码的性能进行定量的分析,从而对代码的优劣有一个比较深入的了解。此外,在Visual Studio 2008中引入了新的负载测试的模型、界面和报表。更重要的是,还有一个连续集成的构建,例如,一个企业有一个开发主线,还有很多开发分支。假定每个开发分支都是其中的一个功能点,当功能点开发完成以后,需要合并到开发主线,在对开发主线进行合并操作的时候,Visual Studio 2008能够自动进行团队构建,并且给出构建的结果。而在Visual Studio 2005时,需要进行很多手工操作。

WPF是微软最新的表示层框架,可以使用户在开发应用程序时,所有的界面都是统一的。WPF具有非常强的3D处理效果。

语言上的增强

在Visual Studio 2008的C++语言当中,MFC可以支持Vista的通用控件。Visual Studio 2008还支持智能感应,除此以外,对于AJAX引入了很多扩展控件,从而可以快速开发 AJAX的应用。新的Vista SDK中包含大量的非托管API。UAC(用户访问控制)是Vista的一种访问控制机制,主要是防止病毒对系统的破坏。

Visual Studio 2008中的VB语言不但可以获取数据,并对数据进行复杂的运算。此外,对XML的处理也更加方便。同时,VB集成开发环境的开发效率有了大幅度提高,变得更加智能。Visual Studio 2008整合了对象、关系型数据、XML的访问方式,语言更加简洁。

高效开发

使用Visual Studio 2008可以高效开发Windows应用。设计器中可以实时反映变更,XAML中智能感知功能可以提高开发效率。同时Visual Studio 2008支持项目模板、调试器和部署程序。使用Expression交互式设计器可以无缝集成设计人员与开发人员的工作流程。

Visual Studio 2008可以高效开发Web应用,集成了 AJAX 1.0,包含 AJAX项目模板。此外,它还可以高效开发Office应用和Mobile应用。

什么是LINQ

LINQ是一种用来进行数据访问的编程模型,使得.NET语言可以直接支持数据查询。LINQ的目标是降低访问数据的复杂度。LINQ可以用统一的方法访问不同类型的数据,可以将数据作为对象使用,能够更好地与编成模型集成,可以在Visual Studio中进行智能提示。

LINQ可以为SQL Server提供对象到关系的映射。此外,LINQ可以将单个类映射到多个表或视图,可以进行存储查询和实体查询

Visual Studio 2008 可自动执行 WCF 手动任务,包括更新代理引用和消除重复任务(例如创建简单托管项目)。Visual Studio 还能解决跨目标和数据协定类型共享等一些困难问题。在本专栏中,我将逐步介绍其新功能及优势,并对其任何缺陷和解决方法做出解释。尽管我将在此使用 C# 项目设置,但除非我另行说明,否则所有设置同样适用于 Visual Basic®。

.NET Framework 跨目标

Visual Studio 的早期版本通常针对随其一起提供的 .NET Framework 版本。例如,Visual Studio 2005 只能生成针对 .NET Framework 2.0 的程序集,而此惯例并不能反映大多数开发人员所面临的真实情况。通常,开发人员需要在维护针对早期版本的 .NET 而编写的旧版应用程序的同时,还要在其新版应用程序中使用新版 Visual

Studio。

此外,此惯例还意味着开发人员在维护为早期版本的 .NET Framework 而编写的应用程序时,无法从效率增强功能(例如 Visual Studio 2005 中引入的代码重构支持)中获益。

问题在于 .NET Framework 各版本不支持跨目标功能。您要么必须安装多个版本的 Visual Studio,要么使用独立的测试和部署内部版本进行补偿。Visual Studio 2008

尝试通过为多个版本的 .NET Framework 提供充分支持(虽然不完美)来解决这一问题。由于实际上 .NET Framework 3.0 和 .NET Framework 3.5 使用的 CLR 版本与 .NET Framework 2.0 使用的相同,唯一的区别在于新引用的程序集,因此 Visual

Studio 仍可针对相同运行库,而为 .NET Framework 版本 2.0、3.0 和 3.5(其中 .NET Framework 版本号对应的是发行版本,而不是运行库版本,运行库版本仍为

CLR 2.0)提供跨目标功能。

在 Visual Studio 2008 中,“Properties”(项目)的“Application”(应用程序)窗格包含一个称为“Target Framework”(目标框架)的新组合框,通过该组合框您就可以针对 .NET Framework 版本 2.0、3.0 和 3.5(参见图 1)。

图 1Visual Studio 2008 中的目标框架属性 (单击该图像获得较小视图)

图 1

Visual Studio 2008 中的目标框架属性 (单击该图像获得较大视图)

Target Framework 值仅在开发时有效,而在运行时无效(您的程序集仍指向 .NET 2.0 CLR)。您选择的值表示您构建程序集时可针对的 .NET Framework 的最早版本。新项目默认被配置为针对 .NET Framework 3.5。如果添加引用,则会变得有些复杂;如果在引用较高版本程序集时,降低 Target Framework 版本,Visual

Studio 2008 将提示您引用出错和内部版本失败。Visual Studio 2008 不允许您向其所需 Framework 版本高于现有项目的 .NET Framework 程序集添加引用。如果您向版本更高的同一解决方案中的其他项目添加引用,Visual Studio 2008 将警告您可能会发生冲突。如果通过浏览程序集来添加引用,Visual Studio 2008 将不会干预您进行操作。

在语言和跨目标方面,请注意,您可以在 C# 中(而不是 Visual Basic 中),通过限制编译器版本来限制使用 .NET Framework 2.0 或 3.0 项目中诸如匿名类型和扩展方法等功能。您可以转至“Build”(内部版本)窗格,然后单击“Advanced”(高级)按钮,并选择“ISO-2 (C# 2.0)”作为语言版本(而不是尚未标准化的默认版本)来执行此操作。

在 Visual Studio 2008 中打开 Visual Studio 2005 WCF 项目时,升级过程中框架版本保持为 2.0。实际上这可以正常运行(请记住,基础运行库版本并未改变),但我建议根据需要手动将其设置为版本 3.0 或 3.5。

使用新项目模板时,Target Framework 版本是最重要的因素。WCF 工作流和整合项目必须针对 .NET Framework 3.5 进行构建;Service Library 项目要求针对 .NET Framework 3.0 或 3.5。“Add Service Reference”(添加服务引用)功能仅当为项目选择 Framework 版本 3.0 或 3.5 时可用,本专栏稍后将介绍此功能。

WCF 提供的主机

Visual Studio 2008 附带了一款名为 的现成的通用服务主机。它位于 C:Program FilesMicrosoft Visual Studio 9.0Common7IDE 中。为了方便使用,我建议将该位置添加到系统的 Path 变量中。WcfSvcHost 是一种简单的命令行实用工具,可接受两个参数:一个是指向包含一个或多个服务类的 .NET 程序集的文件路径,另一个是指向托管 .config 文件的文件路径。例如:

/service: /config:

指定的服务程序集可以是类库程序集 (DLL),也可以是应用程序程序集 (EXE)。WcfSvcHost 将启动一个新进程,该进程将自动托管指定 .config 文件的服务部分中列出的所有服务类。请注意,这些服务类及其服务约定和数据协定不必是公共类型,可以是内部类型。此外,自动托管的服务不需要提供任何元数据,但是它们可以发布元数据(如果选择发布)。

WcfSvcHost 是一种以桌面任务栏图标驻留的 Windows 窗体应用程序。若要关闭主机,只需从任务栏图标上下文菜单中选择“Exit”(退出)即可。使用这种方式终止托管不太妥当,因为 WcfSvcHost 将中止当前正在进行的所有调用,客户端很可能会收到异常。如果单击 WcfSvcHost 任务栏图标,将出现一个对话框,其中列出托管的所有服务(参见图 2)。

图 2WcfSvcHost 服务列表 (单击该图像获得较小视图)

图 2

WcfSvcHost 服务列表 (单击该图像获得较大视图)

该对话框还显示服务的状态及其元数据地址,您可以将这些信息复制到剪贴板,稍后向服务添加引用时可能会用得到。关闭 WcfSvcHost UI 只是将其折叠回任务栏。

WcfSvcHost 的目的就是在开发过程中不再需要使用独立托管程序集来配合服务库。诸如托管项目等的开发工作是一种重复任务,这些主机通常包含大量相同的代码行,当有多个服务库时,这些重复代码容易导致解决方案变得臃肿。为了便于开发和测试,可以将 WcfSvcHost 直接集成到您的 Visual Studio 2008 服务库项目中。在项目属性的“Debug”(调试)窗格中,将 指定为要启动的外部程序,然后将您的类库名及其 .config 文件(自动生成并自动复制到 bin 文件夹)指定为参数。

完成后,当您运行类库(完成上述操作后才能执行运行)时,它将借助该进程附带的调试器由 WcfSvcHost 自动托管。停止调试时,Visual Studio 2008 将以不妥当的方式中止托管。

您甚至可以在 .NET Framework 3.0 应用程序中与 Visual Studio 2005 项目一起使用 WcfSvcHost,由于 WcfSvcHost 只需要 .NET Framework 3.0,因此只需从安装了 Visual Studio 2008 的计算机上复制 WcfSvcHost 即可。为了使用更加方便,建议您将 WcfSvcHost 添加到 .NET Framework 3.0 计算机上的全局程序集缓存 (GAC) 中。

WcfSvcHost 的最后一个功能是能够自动启动客户端应用程序,甚至能够为客户端提供特定于该应用程序的可选参数:

/service: /config:

/client: /clientArgs:123,ABC

此功能对于在自动测试、甚至是简单部署的情况下启动主机和客户端非常有用。

WcfSvcHost 的最大缺陷是只适用于简单情况,例如在打开主机实例之前无需以编程方式访问主机实例的情况,或在其打开之后以编程方式访问其事件模型的情况。与使用 IIS 或 Windows Activation Service (WAS) 进行托管不同,WcfSvcHost 没有对等的服务主机工厂支持。因此,不具备动态添加基址、配置终结点、中止调用以及在主机级别配置自定义行为等功能。通过我对 WCF 的使用体验发现,除了最简单的情况之外,所有其他情况中最终都需要以编程方式访问主机实例,因此我并不将

WcfSvcHost 视为一种成熟、高效的主机,而我自己执行 WAS 或进行专用自托管。

WCF 提供的测试客户端

除服务主机外,Visual Studio 2008 还随附了一个用于进行基本测试的简单通用的测试客户端,您可以使用它调用大多数服务上的操作。正常安装后,测试客户端

位于 , is found after normal installation

at C:Program FilesMicrosoft Visual Studio 9.0Common7IDE 下。您必须为

WcfTestClient 提供一个命令行参数,其中包含要测试的服务的元数据地址:

localhost:9000/

您可以指定任何元数据地址,例如 HTTP-GET 或者 HTTP、TCP 或 IPC(命名管道)上的元数据终结点。也可以指定多个元数据地址:

localhost:8000/ ://localhost:9000/MEX

WcfTestClient 是一个 Windows Forms 3.5 应用程序(参见图 3)。在此图中,左侧的树控件包含测试的服务及其终结点。您可以详细查看某个终结点的约定并选择某项操作。特定于该调用的信息将显示在右侧窗格的选项卡中。图 4 所示为一个简单约定及其实现的示例。 图 3使用 WcfTestClient (单击该图像获得较小视图)

图 3

使用 WcfTestClient (单击该图像获得较大视图)

您可以在方法选项卡的“Request”(请求)部分中输入作为操作参数的一个整数和一个字符串,如图 3 所示。单击“Invoke”(调用)按钮时,它将向服务调度调用,并在“Response”(响应)中显示返回值或输出参数。如果是单向操作,WcfTestClient 将在消息框中通知您已成功调度此操作。如果出现异常,WcfTestClient 将在消息框中显示异常信息,并让您发出其他调用。

WcfTestClient 不使用测试服务来维护传输层会话(或任何其他会话)。所有调用均在新代理实例上进行。此外,所有调用均异步进行,这样 UI 能随时进行响应。但是,尽管是异步调用,WcfTestClient 只允许一次调度一个调用。

WcfTestClient 从代理文件(包括 .config 文件)以静默方式创建程序集,然后从临时位置加载该程序集。如果单击树中的“Config File”(配置文件)项,您可以获取该 .config 文件(添加服务引用时生成的同一 .config 文件),并可以将其显示其选项卡中。

与早期的 Visual Studio ASMX Web 服务测试页不同,通过 WcfTestClient 您可以借助枚举、类或结构(每个类或结构都是其他类或结构的组成部分)等复合参数、甚至是参数集合和参数数组来调用操作。只需展开“Request”(请求)部分中的项,从下拉列表中设置其值(例如枚举值),并进行调用即可。如果操作接受集合或数组,您还需要设置其长度。例如,图 5 显示了以下操作的结果请求和响应: 图 5指定数组长度和值 (单击该图像获得较小视图)

图 5

指定数组长度和值 (单击该图像获得较大视图)

[OperationContract]

bool ProcessNumbers(int[] numbers]

类似地,“Response”(响应)窗格将包含所有返回的复合值或输出参数。这样我们发现了 WcfTestClient 的一个缺陷:为了指定要测试的不同服务,您必须先关闭,并在更改命令行参数后重新启动 WcfTestClient。如果能同时在 GUI 中提供服务地址,则可能会很好地缓解这个问题。

您可以直接将 WcfTestClient 集成到您的 Visual Studio 2008 解决方案中。首先,将类库项目添加到解决方案,并删除所有引用、文件夹和源文件(因为您不需要这些项)。然后,将 设置为外部启动程序,并提供一个或多个测试服务的一个或多个元数据地址,例如 IIS 或 WAS 托管项目的 .svc 地址,或者就此而言,解决方案内部或外部主机项目的任何其他元数据地址。

请注意,如果计算机上只安装了 .NET Framework 3.0,则您不能在其上使用

WcfTestClient,因为 WcfTestClient 需要使用内部 .NET Framework 3.5 树网格控件(用于表示复合参数的控件)。

当然,您可以在一个步骤中结合 WcfTestClient 和 WcfSvcHost,这样即可自动托管服务库中的服务并对其进行测试:

/service: /config:

/client:

/clientArgs:localhost:9000/

但是,可以使用 WcfSvcHost 指定元数据参数。默认情况下,WcfSvcHost 将向指定客户端应用程序传送它在服务 .config 文件中找到的元数据地址。仅当服务未提供自己的元数据或您希望测试客户端使用其他地址时,才应显式指定元数据地址。此外,如果服务 .config 文件包含给定服务的多个元数据终结点,则这些终结点将按以下优先顺序提供:HTTP、TCP、IPC 和 HTTP-GET。您可以在 Visual Studio 2008 中合并这些步骤以进行无缝托管和测试体验。将 指定为启动程序,并将 .config 文件和 指定为客户端。

WCF 服务库

作为 Target Framework 的一项功能,Visual Studio 2008 提供了多个新的

WCF 项目模板。通过“New Project”(新建项目)对话框中的组合框,您可以指定 Target

Framework 的版本(2.0、3.0 或 3.5),如图 6 所示。

图 6WCF 项目模板 (单击该图像获得较小视图)

图 6

WCF 项目模板 (单击该图像获得较大视图)

如果选择 Framework 2.0,则没有任何新模板可用。Framework 3.0 中提供了一个称为 WCF 服务库的新项目模板。此项目类型只是 WcfSvcHost 和

WcfTestClient 的预构建用法,与我前面提到的技术(将两者合二为一)非常类似。请注意,使用 WCF 服务库模板,就不需要将 指定为启动程序或 .config 文件,因为项目文件包含适用于 WCF 服务库的新 ProjectTypeGuids 元素。

但是该模板有一个负面影响:停止调试程序不会终止测试客户端;时间久了,您的桌面会由于孤立客户端而变得杂乱。要解决此问题,只需还原到前面清晰介绍的手动步骤。

WCF 服务库还提供了一个用于服务约定、服务约定的实施及匹配的 .config 文件的简单模板。 利用聚合服务库,您可以通过 WCF 终结点实现 RSS 源,并且可以从返回源的简单服务约定、服务约定的实施及匹配的 .config 文件着手操作。您可以托管和显示自己的源,与托管和显示任何其他服务一样。聚合终结点使用新的 WebHttpBinding 绑定。此新绑定旨在用于接收 Web 请求,而不能用于常规服务调用。

使用“顺序工作流服务库”模板,您可以将终结点的约定操作作为工作流活动来实现,或者将工作流显示为服务。项目将包含一个用于实现简单约定和匹配的 .config 文件的顺序活动。尽管客户端也将与类似传统终结点的终结点进行交互,但其实现完全是工作流驱动的。

“状态机工作流服务库”模板使用状态机而不是顺序工作流来实施其操作(触发状态转换)。工作流项目模板使用 WcfSvcHost 和 WcfTestClient,如同普通 WCF 服务库那样。工作流模板还使用新的上下文绑定对工作流实例 ID 的传递进行管理,从而支持持续工作流。我将在以后的专栏中详细介绍这些绑定。

添加服务引用

Visual Studio 2005 extensions for .NET Framework 3.0 提供了一项用于向

WCF 服务添加引用的基本功能,而不具有 SvcUtil 的许多高级功能。Visual Studio

2008 具有一个新的服务引用对话框,如图 7 所示。

图 7“添加服务引用”对话框 (单击该图像获得较小视图)

图 7

“添加服务引用”对话框 (单击该图像获得较大视图)

您可以在任何项目中打开此新对话框,方法是:右键单击解决方案资源管理器中项目内的任意位置,然后从上下文菜单中选择“Add Service Reference”(添加服务引用)。请注意,必须将项目配置为针对 .NET Framework 3.0(及更高版本)才能启用此选项。

在“Add Service Reference”(添加服务引用)对话框中,首先需要指定服务元数据地址(不是服务 URL,如对话框中所述),然后单击“Go”(执行)查看可用服务终结点(不是服务,如标记所示)。必须指定命名空间(如 MyService)才能包含生成的代理,然后单击“OK”(确定)生成代理并更新 .config 文件。请注意,在多数情况下,Visual Studio 2008 不是足够的智能来推断最清楚的绑定值,因此,它将通过声明绑定的所有默认值来删除 .config 文件。Visual Studio 的未来版本中将会解决此问题。如果您关注对 .config 文件的维护,请先打开 .config 文件,再添加引用,然后执行一次撤消 (Ctrl+Z) 操作,最后手动将 .config 文件条目添加到客户端部分中。

只要 WCF 服务位于网站项目或某个新 WCF 服务库中,您就可以使用“Discover”(搜索)按钮在自己的解决方案中查找这些服务。如果位于网站项目中,Visual

Studio 2008 将检索 IIS 中的元数据或启动基于文件系统的 开发服务器。如果位于 WCF 服务库中,则 WCF 将自动启动其主机 (WcfSvcHost) 以便获取元数据。

可以通过“Advanced”(高级)按钮打开设置对话框,从而调整代理生成,如同使用 SvcUtil(参见图 8)一样。通过使用更直观的选项,您可以配置生成的代理和约定(公共或内部)的可见性;可以为数据类型生成适用于高级互操作方案的消息约定,在此方案中必须遵从现有消息格式(通常为自定义),并可以单击“Add Web Reference”(添加 Web 引用)按钮将引用转换为旧 ASMX Web 服务引用。 图 8服务引用高级选项 (单击该图像获得较小视图)

图 8

服务引用高级选项 (单击该图像获得较大视图)

“Generate asynchronous operations”(生成异步操作)复选框可以为导入的约定中的每个操作添加一对匹配的 Begin 和 End 元素,这两个元素允许客户端在工作线程中异步发出调用,并且通过提供完成回调方法或阻止完成来允许客户端稍后与操作完成进行同步。例如,假设约定的定义如下

[ServiceContract]

interface ICalculator

{

[OperationContract]

int Add(int number1,int number2);

}

则导入的约定将如图 9 所示。

异步调用的匹配客户端代码将类似于如下所示:

CalculatorClient proxy = new CalculatorClient();

int sum;

AsyncCallback completion = (result)=>

{

sum = (result);

(sum == 5);

();

};

dd(2,3,completion,null);

虽然您可以按原样使用这些方法,但是提供给 Begin 的完成回调是从线程池中的线程调用的。如果使用回调访问某些与特定线程相关联的资源,则这样做会出现严重问题。Windows 窗体(或 WPF)应用程序即为典型示例,此应用程序异步调度较长的服务调用(避免阻止 UI),然后希望使用调用结果来更新 UI。不允许使用原始 Begin 进行更新,因为只允许 UI 线程更新 UI。为了更好地处理此情况,已用受保护的 InvokeAsync 方法扩展了 ClientBase 基类,该方法可以获取客户端的同步上下文并将其用于调用完成回调,如图 10 所示。

ClientBase 还提供了一个事件参数帮助器类和两个用于启动和结束异步调用的专用委托。生成的代理类由 ClientBase 派生而来,此代理类将使用这些基本功能。代理将具有一个 Completed 公共事件(该事件使用特定于异步方法结果的强类型事件参数类)和两个 Async 方法(用于异步调度调用):

partial class AddCompletedEventArgs : AsyncCompletedEventArgs

{

public int Result

{get;}

}

class CalculatorClient : ClientBase,ICalculator

{

public event EventHandler AddCompleted; public void AddAsync(int number1,int number2,object userState);

public void AddAsync(int number1,int number2);

//Rest of the proxy

}

客户端还可以为 Completed 事件订阅事件处理程序,以便在完成时调用此事件处理程序。使用 Async 与 Begin 的主要差别在于:Async 方法获取客户端的同步上下文,并在该同步上下文中激发

Completed 事件,如图 11 所示。

通过“Collection”(集合)类型组合框,您可以指定如何向客户端显示在服务元数据中找到的某些类型的集合和数组。例如,如果服务操作返回 IEnumerable、IList 或 ICollection 集合中的某一个,则默认情况下代理会将其显示为数组。例如,以下服务端操作

[OperationContract]

IEnumerable GetNumbers();

将在代理上表示为:

[OperationContract]

int[] GetNumbers();

但是,您可以请求 Visual Studio 2008 使用其他集合(例如用于进行数据绑定的

BindingList、List、Collection 和 LinkedList 等)。如果可以进行转换,代理将使用请求的集合类型而不是数组,如下所示:

[OperationContract]

List GetNumbers();

字典也具有类似功能。通常情况下,如果服务操作返回可序列化的字典,如下所示

[Serializable]

class MyDictionary : IDictionary

{...}

[OperationContract]

MyDictionary GetDictionary();

代理类随后会将该字典表示为 Dictionary,这是以下 Dictionary 集合类型组合框的默认值:

[OperationContract]

Dictionary GetDictionary();

但是,您可以请求其他字典类型(如 SortedDictionary、HashTable 或

ListDictionary),代理将改为使用这些字典(如果可能):

[OperationContract]

SortedDictionary GetDictionary();

综上所述,新服务引用最重要的功能就是能够在程序集之间共享数据协定类型。使用 Visual Studio 2005,如果客户端将服务引用添加到两个支持相同数据协定的独立服务中,那么客户端将获得两个类型完全相同(表示相同数据协定)的不同服务引用。使用 Visual Studio 2008,默认情况下,如果客户端引用的任何程序集所具有的数据协定类型与引用服务的元数据中显示的数据协定类型相匹配,则 Visual Studio 2008

将不会再次导入该类型。有必要再次强调一下,现有数据协定引用必须位于另一个引用程序集中,而不是位于客户端项目本身中。Visual Studio 的未来版本中可能会解决此限制。目前,解决方法和最佳实践都很明显:将所有共享数据协定都构建到指定的类库中,并让所有客户端都引用该程序集。 通过服务引用的高级设置对话框,您可以配置数据协定共享。默认情况下“Reuse

types in the referenced assemblies”(重用引用程序集中的类型)复选框处于选中状态,但您可以关闭此功能。不管复选框的名称是什么,此复选框都将只能共享数据协定而不能共享服务约定。使用复选框下面的单选按钮(参见图 8),还可以指示 Visual

Studio 2008 在所有引用的程序集中重用数据协定,或者通过选中列表中的特定程序集来限制共享这些程序集。

添加引用后,项目将具有一个新文件夹 Service References,该文件夹中显示了每个引用的服务的服务引用项(参见图 12)。

图 12

服务引用文件夹

随时可以右键单击引用并选择“Update Service Reference”(更新服务引用)来重新生成代理并更新客户端的 .config 文件。由于服务引用项中还包含一个记录了所使用的原始元数据地址的文件,因此可以执行此操作。

还可以选择“Configure Service Reference”(配置服务引用)打开一个对话框,该对话框与添加引用时使用的高级设置对话框类似。通过配置服务引用对话框,您可以更改服务元数据地址以及其他高级代理设置。

微软公司计划添加Windows Live应用程序的功能到Visual Studio开发工具包中,这样程序员就能以最快速度开发出有关于Live网络服务平台的应用.

公司计划在Visual Studio 2008中正式实施这一捆绑战略,目前他们正在进行技术测试,包括目前的2005版本,Beta版本将在10-11月发布.

Windows Live是微软一系列网络服务的名字,包括搜索,即时通信,E-Mail,Blog和图像共享等,此前,Windows Live具有一系列的SDK,但将它整合到开发工具还是第一次.

最让程序员激动的是,Windows Live的周边开发是有回报的,程序员将得到微软的分红,大约0.25美元每独立用户,对于Live应用集中的程序来说,还是非常诱人的.

10个C#编程和Visual Studio使用技巧

2010-09-28 08:52 黄永兵 译 我要评论()

C#是一门伟大的编程语言,与C++和Java相比,它的语法更简单,相对来说更好入门。Visual

Studio作为.Net平台上最重量级的IDE,也通过不断的更新为开发者带来更出色的开发体验。本文将介绍10个C#编程和Visual Studio IDE使用技巧。

C#是一门伟大的编程语言,与C++和Java相比,它的语法更简单,相对来说更好入门,经历10年的发展,C#已经成为编程语言领域强有力的竞争者,每一年我们都能看到它的进步,每一个新版本都加入了许多新特性,总的来说,作为一门编程语言,它没有让C#开发者社区失望。Visual Studio亦是如此,新版本的Visual Studio 2010所带来的新特性也让开发者们兴奋不已。本文下篇请点击这里。

对开场白没兴趣?好吧,我们直接切入正题,下面介绍10个C#编程和Visual Studio IDE使用技巧。

1、e

你是否知道这个属性是与平台无关的?允许你根据每个平台输出新的换行字符。

1. ine("My Tips On ,{0}C#", e);

2、命名空间别名

你是否知道可以使用更短的别名代替长的命名空间?你是否遇到过需要限制完整的命名空间以避免产生歧义?看下面的代码示例,它是使用扩展的.NET Framework控件创建的一个通用库。

2.

3.

4.

5.

using trols;

using ntrols;

/* Assuming that you had a Text Box control in both the namespace,

6.

7.

8.

you would have to fully qualify the class object with the

complete avoid that, you can use namespace alias.

Change as below */ 9.

10.

11.

12.

13.

14.

using trols;

using mc = ntrols;

/*and then use, /*

x textbox = new x();

3、DebuggerBrowsable属性

每个C#开发人员应该都有过程序调试的经历,这个属性在调试期间控制对象行为的能力非常强大,在调试过程中它在一个小提示窗口中显示对象,它可以用于隐藏私有成员或在调试窗口中显示也是多余的成员,例如,当你调试类对象时,在调试窗口中你可以看到私有变量,这个时候你就可以使用[DebuggerBrowsable()]属性来隐藏它们,下面是可见的代码。

15.

16.

17.

18.

19.

20.

21.

22.

23.

24.

public class MyClass

{

private string _id;

public string InternalID

{

get { return _id; }

set { _id = value; }

}

}

下面是使之隐藏的代码:

25.

26.

27.

28.

29.

30.

31.

32.

33.

34.

35.

[DebuggerBrowsable()]

public class MyClass

{

private string _id;

public string InternalID

{

get { return _id; }

set { _id = value; }

}

}

4、DebuggerDisplay属性 这个属性可让具有可读描述的变量对象显示出来,它有助于提供团队其它成员未来阅读代码的效率,它的用法也是非常简单的,下面的代码示例显示了变量的值。

36.

37.

38.

39.

40.

public class MyClass

{

[DebuggerDisplay("Value = {myVariable}")]

public string myVariable = "mydisplay";

}

5、为项目创建虚拟目录

你可以强制每个开发人员在本地为项目创建一个同名的虚拟目录,这个来自Visual

Studio IDE的技巧将有助于代码在多个C#开发人员的电脑之间同步。在项目名称上点击右键,选择“属性”,在“Web”选项卡中,选中“使用本地IIS Web服务器”选项,然后为其指定一个虚拟路径,如下图所示。

图 1 设置项目的本地虚拟目录路径

这样设置后,所有使用该项目文件的开发人员都会收到一个要求,在本地机器上创建一个同名的虚拟目录。

6、改变项目平台

你可以改变应用程序的生成目标平台,这里的平台指的是32位和64位环境,在项目名称上点击右键,选择“属性”,在“Build”选项卡中,选择需要的目标平台,如下图所示。

图 2 修改项目的目标平台

7、代码定义窗口

这个窗口允许你跳转到对象的定义,你可以按F12键快速跳转到对象的定义位置,在代码编辑器的任意对象上试试这个功能,相信一定不会让你失望的。此外,还有一个专门的代码定义窗口,当你按照Ctrl+W,D组合键时就会弹出一个代码定义窗口。

41.

42.

43.

44.

if (pe == )

{

//Your code here.

}

如果你将光标停留在ListItemType上面,然后按下组合键,你将会看到如下图所示的一个窗口。

图 3 代码定义窗口

8、Null合并运算符

Null合并运算符允许你以很简洁的方式比较空值,它使用两个问号表示。例如,myfunction返回的值可能是一个空的整数值,在这种情况下,你可以使用合并运算符快速检查它是否为空,然后返回一个代替值。

45.

46.

int myExpectedValueIfNull = 10;

int expectedValue = myfunction() ?? myExpectedValueIfNull

9、using语句快捷键

按下Ctrl+.会弹出一列可用的using语句,使用箭头键进行移动,按下回车键确认选择,如下图所示。

图 4 在代码编辑器中快速调出using语句

10、寻找恐怖的数据集合并错误根本原因

你是否遇到过无法找出数据集合并错误的原因?现在有办法了,使用try-catch将你的代码包围起来,最好是在异常处理块中观察特定代码的输出,可以准确捕捉到合并失败的原因。

47.

48.

StringBuilder error Messages = new StringBuilder();

try 49.

50.

51.

52.

53.

54.

55.

56.

57.

58.

59.

60.

61.

{

DataSet dataSet1 = populateDataSet(1);

DataSet dataSet2 = populateDataSet(2);

(dataset2);

}

catch (ception de)

{

foreach (DataTable myTable in )

{

foreach (DataRow myRow in ors())

{

foreach (DataColumn myColumn in umnsInError())

62.

63.

{

//loop through each column in the row that has caused the error

64.

65.

66.

//during the bind and show it.

error Messages .Append((

"Merge failed due to : {0}", umnError(myColumn)));

67.

68.

69.

70.

}

}

}

}

小结

希望你能灵活运用这些C#编程和Visual Studio技巧,享受写代码的乐趣,如果你有其它技巧愿意和大家分享,欢迎在本文后面发表评论

升级到Visual Studio 2008的10个技巧 收藏

来源:InfoQ

升级到Visual Studio 2008,来个飞跃。Visual Studio 2008最近发布了,开发者经常希望自己成为安装他们最青睐开发工具最新版本的第一人。但是,若在升级过程中做出了错误的选择的话,就会为之付出一些代价。由于Jon Galloway等人,确保了升级过程是一个平稳的过程,而且只有十步之遥。

1. 首先,小心的卸载所有先前发布的相应软件和模块

这是最重要的步骤之一。如果您有任何先前版本的.NET Framework 3.5或Visual Studio 2008,那么这些软件都必须在安装Visual Studio 2008 RTM之前被卸载。在安装之前关闭一些相关的软件也是个不错的主意:

关闭所有的MS Office应用程序(如Outlook,Word等)

关闭Internet Explorer

关闭所有的windows资源管理器

关闭所有其它不需要打开的程序

以下是Scott Guthrie 提供的对先前发布版本的合适的卸载顺序,这些提到的软件可能有些您安装了而有些没有,只要确保如下的顺序即可:

移除“MSDN Library for Visual Studio 2008 Beta”

移除“Microsoft SQL Server Compact Edition 3.5”

移除“Microsoft SQL Server Compact Edition 3.5 Design Tools”

移除“Microsoft SQL Server Compact Edition 3.5 for Devices”

移除“Microsoft Visual Studio Performance Collection Tools”

移除“Windows Mobile 5.0 SDK R2 for Pocket PC”

移除“Windows Mobile 5.0 SDK R2 for Smartphone”

移除“Crystal Reports 2007”

移除“Visual Studio Asset System”

移除“Microsoft Visual Studio Web Authoring Component / Microsoft Web Designer Tools”

移除“Microsoft Visual Studio 2005 Tools for the 2007 Microsoft Office System Runtime”

移除“Microsoft Visual Studio 2005 Tools for the 2007 Microsoft Office System Runtime

Language Pack” (只针对非英语版)

移除“Microsoft Visual Studio Tools for Office Runtime 3.0”

移除“Microsoft Document Explorer”

移除“Microsoft Document Explorer 2005 Language Pack” (只针对非英语版)

移除“Microsoft Device Emulator 3.0”

移除“Microsoft .NET Compact Framework 3.5”

移除“Microsoft .NET Compact Framework 2.0 SP1”

移除“.NET Framework 2.0 SDK”

移除“Microsoft Visual Studio Codename Orcas Remote Debugger”

移除“Microsoft Visual Studio 64bit Prerequisites Beta” (只针对64位平台)

移除“Microsoft .NET Framework 3.5"

2. 只安装您真正会用到的部分

不要仅仅因为DVD上什么都有,就要把所有的东西都装上。您安装的软件越少,以后打的补丁就越少,其占用的磁盘空间也越少。

3. 不要被前面的重启提示弄傻了

.NET Framework 3.5的安装程序会提示用户在安装的过程中间重启,不要理会它。所有的重启都要等到安装完Visual Studio 2008之后再执行。

4. 如果您要用Team System,就安装Team System 2008 Team Explorer

如果您准备连接到Team Foundation服务器,那么您需要安装Team System 2008 Team

Explorer,否则无法连接到Team Foundation服务器。

这篇文档告诉您如何从Team Foundation服务器安装介质(光盘,下载包等)得到Team

Explorer,但是这是一个3GB的下载版本。最简单的方法是得到单独的Team Explorer安装版,这个安装版只有387MB。

5. 安装之后,将您的IDE设置恢复到默认设置。

如果IDE的设置在任何先前发布的版本中做了更改,它们都应该被恢复到默认设置。可以在命令行运行 /ResetSettings 或者在Visual Studio 2008中点击菜单 Tools

> Import and > Reset all settings

6. 抓住这个时机改变您的Visual Studio主题

这是个很好的时机来修改主题。Visual Studio的主题系统允许开发者尝试一个新的主题,如果他们不喜欢,还可以改。我们推荐您选择一个使视觉更舒适的主题,特别是如果您每个星期要在IDE环境下工作很多个小时的话。

7. ListView中的Breaking changes (Breaking changes 意味着新的版本在这些地方将不再保证向前兼容,从而导致同样的代码在不同的版本中有不同的行为,或者旧的代码在新版本环境中不再支持)

Jon Galloway指出了这个非常重要的一点:

如果您使用先前发布的 ListView写过任何代码,您需要升级您的标签。事实上这里只有一个真正的区别,这个区别会带来一些不同的影响:容器元素被asp:PlaceHolder控件代替了。先前的版本允许您使用任何 runat="server" 标记做为一个容器元素。我更喜欢RTM的行为-旧的方式有时候有点太神奇,它根据ID用子元素填满父元素。新的用法更加直接,而且这种用法使得ListView中被标记的内容和被替代的内容一目了然。

具体而言,以前使用元素ItemContainer的地方,现在要用一个叫做ItemPlaceholder的占位符来代替。如果这样出错了,您会得到如下的出错信息:

An item placeholder must be specified on ListView ‘SampleListView′. Specify an item

placeholder by setting a control’s ID property to “itemPlaceholder”. The item placeholder control

must also specify runat=”server”.

8. LINQ-to-SQL 中的Breaking changes

任何先前版本的LINQ-to-SQL代码都需要被依照以下的说明更新。

把 Add 和 AddAll 方法改成 InsertOnSubmit 和 InsertAllOnSubmit. 把 Remove 和 RemoveAll 改成 DeleteOnSubmit 和 DeleteAllOnSubmit.

通过如下更改把 .dbml 文件的编码格式改为 utf-8

<?xml version="1.0" encoding="utf-16"?>

修改为

修改中如下一行(注意版本号的区别):

<add assembly="tExtensions, Version=2.0.0.0, Culture=neutral,

PublicKeyToken=B77A5C561934E089"/>

修改为

<add assembly="tExtensions, Version=3.5.0.0, Culture=neutral,

PublicKeyToken=B77A5C561934E089"/>

9. 下载更新过的Microsoft Silverlight 1.1 Tools Alpha for Visual Studio 2008

装载Visual Studio 2008时这些工具不会自动准备好。所以如果要做与Silverlight 1.1相关的开发,就得自己把它们弄过来。

10. 把您的解决方案都升级为Visual Studio 2008的格式

这是一个节省您很多时间的相当大的一个问题。由于Visual Studio 2008的解决方案文件和工程文件使用了一种新的格式,用Visual Studio 2008打开这些解决方案和工程会把它们升级。如果需要升级的工程很多,在命令行运行 /Upgrade 命令可以加快升级速度。

这些技巧可以帮助开发者在初试Visual Studio 2008的时候一切顺利。更多有关Visual

Studio 2008的信息可以在微软公司的 MSDN 网站和Scott Guthrie的blog上找到。

本文来自CSDN博客,转载请标明出处:/tongdoudpj/archive/2007/12/05/

安装问题

控件工具箱是空的: 我们看到几个人遇上了这样一个情况,当他们在VS 2008中创建一个网站或web应用时,他们发现控件工具箱是空的,源码视图也不提供intellisense。这个问题表明, 由于机器上已经安装的一些.NET框架热补(Hotfixes)的干扰,.NET 3.5版本的没有被正确地安装在机器上。这篇博客贴子描述了如何解决这个问题的方案。

JavaScript Intellisense和加彩没有被启用: 我们看到几个人遇上了这样一个情况,由于安装时一个注册表设置没有被正确配置,JavaScript代码加彩和intellisense没有被启用。这篇博客贴子描述了如何解决这个问题的方案。

安装程序在Windows Vista上要求Windows XP SP2版本: 我们看到几个人在Windows Vista上遇上了问题,VS 2008或者.NET框架3.5的Beta2向用户显示错误信息,要求他们安装Windows XP SP2(尽管他们在运行Vista!)。这篇博客贴子描述了解决这个问题的一个替代方案。

DevEnv /resetsettings: 如果你曾在机器上安装过早期版本的Orcas或VS

2008的话(Beta1或某个CTP版本),你需要在安装Beta2后重新设定VS 2008设置。如果你不这么做的话,有些设置会非常奇怪(一些窗口在出现在奇怪的地方),你也有可能看到一些IDE性能问题。你可以在命令行上对VS 2008的IDE版本键入“DevEnv /resetsettings”来重新设定你的设置。我曾在Beta 2发布贴子里对此有所讨论。

部分信任(Partial Trust)政策中的.NET 3.5网站和LINQ to SQL: LINQ和LINQ to SQL程序集默认的信任政策,以及.NET 3.5 网站的文件不允许应用在中等信任(medium trust)环境里运行。如果你把应用部署到远程主机上,你会受到影响。这篇博客贴子描述了如何在Beta2中解决这个问题的方案(在最终版中你不需要采取这些步骤)。

AJAX 多定向问题

: 就象我在原先的Beta 2发布博客贴子里提到的那样,就在发布Beta 2之前,我们发现了 AJAX 的一个并行安装的问题。你需要确认在安装VS 2008之后,运行DisableAjaxPolicy脚本来更正这个问题(运行只需几秒钟)。

VS 2008中的 AJAX 的多定向: 你可以使用Visual Studio 2008来构建针对.NET 2.0和 AJAX 1.0或者针对.NET 3.5和 AJAX 3.5的 AJAX应用。我在《.NET 3.5 和VS 2008中的 AJAX》博客贴子里,对此做了讨论。因为上面这个 DisableAjaxPolicy补丁,用VS 2008开发的针对 AJAX 1.0的应用在Beta 2中工作起来并不象我们想要的那样顺利。这篇《使用VS 2008开发针对 AJAX 1.0的应用》博客贴子讨论了在Beta 2中实现这个目的的最佳方式。