演练:创建在项目加载时触发的简单项目功能

更新:2010 年 7 月

可以创建项目功能,以在发生与项目相关的操作时执行自定义操作。 在本演练中,您会创建一个名为 SampleProjectFeature 的项目功能,该功能在加载数据库项目时显示一个对话框。 可以修改此示例,以在加载数据库项目时执行操作。

在本演练中,您将完成以下主要任务:

  • 创建 Visual Studio 包

  • 定义项目功能

  • 测试项目功能

系统必备

您需要以下组件来完成本演练:

  • 必须已安装 Visual Studio 2010 专业版、Visual Studio 2010 高级专业版或 Visual Studio 2010 旗舰版。

  • 必须具有数据库项目。

  • 还必须已在计算机上安装 Visual Studio 2010 SDK。 若要下载此工具包,请参见 Microsoft 网站的以下页面:Visual Studio 2010 SDK

提示

本演练专供已熟悉 Visual Studio 数据库功能的用户使用。 同时,您还应熟悉基本的 Visual Studio 概念,例如如何创建类库以及如何使用代码编辑器向类添加代码。

创建 Visual Studio 包

启动 Visual Studio 集成包向导

  1. 在**“文件”菜单上指向“新建”,再单击“项目”**。

  2. 在**“已安装的模板”列表中,展开“其他项目类型”节点,然后单击“扩展性”**节点。

  3. 在详细信息窗格中单击**“Visual Studio 包”**。

    重要说明重要事项

    如果未安装 Visual Studio 2010 SDK,则“Visual Studio 集成包”项目类型不可用。

  4. 在**“名称”**中,键入“SampleProjectFeature”。

  5. 单击**“确定”**。

    将出现**“Visual Studio 集成包向导”**。

    接下来,使用该向导配置要创建的项目。

使用 Visual Studio 集成包向导创建项目

  1. 单击**“下一步”**。

  2. 在**“选择语言”中单击“Visual C#”**。

    提示

    也可以使用 Visual Basic 或 Visual C++ 创建包。 本演练仅演示适用于 Visual Basic 和 Visual C# 的代码示例。

  3. 在**“获取用于程序集签名的密钥”中,单击“生成用于对程序集进行签名的新密钥文件”**。

  4. 单击**“下一步”**。

  5. 在**“公司名称”**中,键入 MyCompany。

  6. 在**“VSPackage 名称”**中,键入 SampleProjectFeature。

  7. (可选)可以提供特定版本号。

  8. (可选)可以对您的包使用的图标进行自定义。

  9. (可选)可以在**“详细信息”**中提供有关您的包的其他信息。

  10. 单击**“下一步”**。

  11. 选中**“菜单命令”**复选框。

  12. 验证**“工具窗口”“自定义编辑器”**复选框是否已清除。

  13. 单击**“下一步”**。

  14. 在**“命令名”**中,键入 Toggle Project Loaded Dialogs。

  15. 在**“命令 ID”**中,键入 cmdidEnableDialogs。

  16. 单击**“下一步”**。

  17. 清除**“集成测试项目”“单元测试项目”**复选框。

    提示

    如果您要创建由您的组织实际使用的包,则应考虑创建针对包的测试,以验证包是否可正常工作。

  18. 单击**“完成”**。

    一个 Visual Studio 集成包项目随即创建,并出现在解决方案资源管理器中。

    接下来,您将自定义包中的代码,以定义数据库项目功能。

定义项目功能

若要为定义数据库项目功能而修改包定义,必须更新包定义,然后必须添加 SampleProjectFeature 类。

更新包定义

  1. 在解决方案资源管理器中,双击 SampleProjectFeaturePackage.cs,以在代码编辑器中打开该文件。

  2. 在代码编辑器中找到 MenuItemCallback 方法。

  3. 用下面的代码替换方法定义:

            private void MenuItemCallback(object sender, EventArgs e)
            {
                SampleProjectFeature.EnableDialogs = !SampleProjectFeature.EnableDialogs;
            }
    

    提示

    “错误列表”中将出现一条错误,因为您尚未定义 SampleProjectFeature 类和 EnableDialogs 方法。

  4. 在**“文件”**菜单上,单击“保存 SampleProjectFeaturePackage.cs”。

    接下来定义项目功能类。

定义 SampleProjectFeature 类

  1. 在解决方案资源管理器中,右击 SampleProjectFeature 项目,指向**“添加”,然后单击“类”**。

    将显示**“添加新项”**对话框,其中已突出显示类模板。

  2. 在**“名称”**中,键入“SampleProjectFeature.cs”。

  3. 单击**“添加”**。

    新类即添加到您的项目,代码编辑器随即出现并显示类定义。

  4. 在解决方案资源管理器中,右击该项目,然后单击**“添加引用”**。

    将显示**“添加引用”**对话框。

  5. 单击**“.NET”**选项卡。

  6. 在组件列表中,突出显示以下引用并单击**“确定”**:

    • Microsoft.Data.Schema

    • Microsoft.VisualStudio.Data.Schema.Package

  7. 在代码编辑器中,将以下 using 语句添加到类定义:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.Data.Schema.Extensibility;
    using Microsoft.Data.Schema;
    using Microsoft.VisualStudio.Data.Schema.Package.Project;
    using Microsoft.VisualStudio.Shell.Interop;
    using System.Globalization;
    
  8. 修改类定义,以指定基类并提供一个特性,该特性用于指定此功能与哪些数据库架构提供程序兼容。 对于本演练,示例与所有数据库架构提供程序兼容。

        [DatabaseSchemaProviderCompatibility(typeof(DatabaseSchemaProvider))]
        class SampleProjectFeature : IDatabaseProjectFeature
        {
        }
    

    关键接口、类型和方法为 DatabaseSchemaProviderCompatibilityAttributeDatabaseSchemaProviderIDatabaseProjectFeature

  9. 将一对属性添加到类:

            public static bool EnableDialogs { get; set; }
            private IDatabaseProjectNode ProjectNode { get; set; }
    

    第一个属性由可以禁用或启用此项目功能的命令使用。 值得注意的接口为 IDatabaseProjectNode

  10. 将下面的构造函数添加到您的类:

            static SampleProjectFeature()
            {
                EnableDialogs = true;
            }
    

    该构造函数初始化 EnableDialogs 属性。

  11. 将 Initialize 方法添加到类:

            public void Initialize(IDatabaseProjectNode projectNode)
            {
                ProjectNode = projectNode;
    
                // Hook up to a few events
                ProjectNode.ProjectLoaded += delegate
                {
                    ShowDialog("In ProjectLoaded Event");
                };
            }
    

    Initialize 方法标识要应用该功能的项目,然后准备监视 ProjectLoaded 事件。

  12. 最后,添加 ShowDialog 方法,该方法会在发生 ProjectLoaded 事件时显示一个对话框(如果启用了该功能):

            void ShowDialog(string msg)
            {
                if (!SampleProjectFeature.EnableDialogs)
                    return;
    
                // Show a Message Box to indicate that we were here
                IVsUIShell uiShell = (IVsUIShell)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(SVsUIShell));
                Guid clsid = Guid.Empty;
                int result;
                Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(uiShell.ShowMessageBox(
                           0,
                           ref clsid,
                           "Simple Project Feature",
                           msg,
                           string.Empty,
                           0,
                           OLEMSGBUTTON.OLEMSGBUTTON_OK,
                           OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST,
                           OLEMSGICON.OLEMSGICON_INFO,
                           0,        // false
                           out result));
            }
    

    如果用户已使用菜单命令关闭该功能,则该方法将返回。 否则,该方法显示一个对话框。 在您自己的项目功能中,可以执行其他处理而不是显示对话框。

  13. 在**“文件”菜单上,单击“保存 SampleProjectFeature.cs”**。

接下来,将生成项目。

生成项目

  • 在**“生成”菜单上,单击“生成解决方案”**。

接下来,将收集项目中生成的程序集信息,其中包括版本、区域性和 PublicKeyToken。

收集程序集信息

  1. 打开“开始”菜单,依次指向“Microsoft Visual Studio 2010”和“Visual Studio 工具”,然后单击“Visual Studio 命令提示(2010)”。

  2. 定位到包含生成的程序集 (SampleProjectFeature.dll) 的文件夹。

  3. 键入以下命令行:

    SN.EXE -T SampleProjectFeature.dll

  4. 记下该公钥标记。 在下一个过程中将会用到它。

接下来,将使用上一过程中收集的程序集信息创建 XML 文件。

创建 XML 文件

  1. 在**“解决方案资源管理器”**中,选择 SampleProjectFeature 项目。

  2. 在**“项目”菜单上选择“添加新项”**。

  3. 在**“模板”窗格中,找到并选择“XML 文件”**项。

  4. 在**“名称”文本框中键入 SampleProjectFeature.Extensions.xml,然后单击“添加”**按钮。

    此时 SampleProjectFeature.Extensions.xml 文件将添加到**“解决方案资源管理器”**的项目中。

  5. 打开 SampleProjectFeature.Extensions.xml 文件,将其更新以匹配以下 XML。 替换在上一过程中检索的 PublicKeyToken。

    <?xml version="1.0" encoding="utf-8"?>
    <extensions assembly=""
                version="1" xmlns="urn:Microsoft.Data.Schema.Extensions"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="urn:Microsoft.Data.Schema.Extensions Microsoft.Data.Schema.Extensions.xsd">
    
      <extension type=" MyCompany.SampleProjectFeature.SampleProjectFeature" assembly="SampleProjectFeature, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nnnnnnnnnnnnnnnn" enabled="true"/>
    </extensions>
    
  6. 在**“文件”菜单上,单击“保存”**。

接下来,修改 Extensions.xml 文件的属性,以将其包含在 vsixmanifest 中。

将 SampleProductFeature.Extensions.xml 包括在 vsixmanifest 中

  1. 在“解决方案资源管理器”中,单击 SampleProjectFeature.Extensions.xml。

  2. 在“属性”窗口中,将**“生成操作”属性更改为“内容”**。

  3. 将“包括在 VSIX 中”属性更改为**“True”**。

  4. 在**“文件”菜单上,单击“全部保存”**。

  5. 在“生成”菜单上,单击“生成 SampleProjectFeature.cs”。

    将更新 vsixmanifest 文件。 接下来,准备好测试您的项目功能。

测试项目功能

若要测试项目功能,必须先生成该功能,然后可以按 F5 启动 Visual Studio 的实验性生成。

生成并测试数据库项目功能

  1. 在**“项目”菜单上,单击“生成”**。

    项目应成功生成。

  2. 按 F5 在 Visual Studio 的实验性生成中运行您的包。

    将出现 Visual Studio 的实验实例。 在“工具”菜单上,出现“Toggle Project Loaded Dialogs”命令。

  3. 在**“文件”菜单上,指向“打开”,然后单击“项目/解决方案”**。

  4. 浏览至要打开的数据库项目 (.dbproj),然后单击**“打开”**。

    随着数据库项目的加载,会出现一个对话框,其中显示消息“Simple Project Feature In ProjectLoaded Event”。

    此时,可以自定义您的项目功能,以添加更多功能。

后续步骤

如果将本演练中创建的功能复制为您自己的工作起始点,则必须:

  • 为扩展指定唯一的名称

  • 为扩展指定唯一的 GUID

在使用**“Visual Studio 集成包向导”**创建新包时,将创建一个新的 GUID。

包在注册后方可在 Visual Studio 中的常规实例中使用。 有关 VSPackage 的更多信息,请参见:

请参见

任务

How to: Troubleshoot VSPackages

概念

扩展 Visual Studio 的数据库功能

数据库和服务器项目概述

其他资源

为数据库项目创建自定义功能

修订记录

日期

修订记录

原因

2010 年 7 月

已对 Extensions.xml 文件进行少量修正以解决客户确定的问题。

客户反馈