演练:创建在项目加载时触发的简单项目功能
更新: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 集成包向导
在**“文件”菜单上指向“新建”,再单击“项目”**。
在**“已安装的模板”列表中,展开“其他项目类型”节点,然后单击“扩展性”**节点。
在详细信息窗格中单击**“Visual Studio 包”**。
重要事项 如果未安装 Visual Studio 2010 SDK,则“Visual Studio 集成包”项目类型不可用。
在**“名称”**中,键入“SampleProjectFeature”。
单击**“确定”**。
将出现**“Visual Studio 集成包向导”**。
接下来,使用该向导配置要创建的项目。
使用 Visual Studio 集成包向导创建项目
单击**“下一步”**。
在**“选择语言”中单击“Visual C#”**。
提示
也可以使用 Visual Basic 或 Visual C++ 创建包。 本演练仅演示适用于 Visual Basic 和 Visual C# 的代码示例。
在**“获取用于程序集签名的密钥”中,单击“生成用于对程序集进行签名的新密钥文件”**。
单击**“下一步”**。
在**“公司名称”**中,键入 MyCompany。
在**“VSPackage 名称”**中,键入 SampleProjectFeature。
(可选)可以提供特定版本号。
(可选)可以对您的包使用的图标进行自定义。
(可选)可以在**“详细信息”**中提供有关您的包的其他信息。
单击**“下一步”**。
选中**“菜单命令”**复选框。
验证**“工具窗口”和“自定义编辑器”**复选框是否已清除。
单击**“下一步”**。
在**“命令名”**中,键入 Toggle Project Loaded Dialogs。
在**“命令 ID”**中,键入 cmdidEnableDialogs。
单击**“下一步”**。
清除**“集成测试项目”和“单元测试项目”**复选框。
提示
如果您要创建由您的组织实际使用的包,则应考虑创建针对包的测试,以验证包是否可正常工作。
单击**“完成”**。
一个 Visual Studio 集成包项目随即创建,并出现在解决方案资源管理器中。
接下来,您将自定义包中的代码,以定义数据库项目功能。
定义项目功能
若要为定义数据库项目功能而修改包定义,必须更新包定义,然后必须添加 SampleProjectFeature 类。
更新包定义
在解决方案资源管理器中,双击 SampleProjectFeaturePackage.cs,以在代码编辑器中打开该文件。
在代码编辑器中找到 MenuItemCallback 方法。
用下面的代码替换方法定义:
private void MenuItemCallback(object sender, EventArgs e) { SampleProjectFeature.EnableDialogs = !SampleProjectFeature.EnableDialogs; }
提示
“错误列表”中将出现一条错误,因为您尚未定义 SampleProjectFeature 类和 EnableDialogs 方法。
在**“文件”**菜单上,单击“保存 SampleProjectFeaturePackage.cs”。
接下来定义项目功能类。
定义 SampleProjectFeature 类
在解决方案资源管理器中,右击 SampleProjectFeature 项目,指向**“添加”,然后单击“类”**。
将显示**“添加新项”**对话框,其中已突出显示类模板。
在**“名称”**中,键入“SampleProjectFeature.cs”。
单击**“添加”**。
新类即添加到您的项目,代码编辑器随即出现并显示类定义。
在解决方案资源管理器中,右击该项目,然后单击**“添加引用”**。
将显示**“添加引用”**对话框。
单击**“.NET”**选项卡。
在组件列表中,突出显示以下引用并单击**“确定”**:
Microsoft.Data.Schema
Microsoft.VisualStudio.Data.Schema.Package
在代码编辑器中,将以下 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;
修改类定义,以指定基类并提供一个特性,该特性用于指定此功能与哪些数据库架构提供程序兼容。 对于本演练,示例与所有数据库架构提供程序兼容。
[DatabaseSchemaProviderCompatibility(typeof(DatabaseSchemaProvider))] class SampleProjectFeature : IDatabaseProjectFeature { }
关键接口、类型和方法为 DatabaseSchemaProviderCompatibilityAttribute、DatabaseSchemaProvider 和 IDatabaseProjectFeature。
将一对属性添加到类:
public static bool EnableDialogs { get; set; } private IDatabaseProjectNode ProjectNode { get; set; }
第一个属性由可以禁用或启用此项目功能的命令使用。 值得注意的接口为 IDatabaseProjectNode。
将下面的构造函数添加到您的类:
static SampleProjectFeature() { EnableDialogs = true; }
该构造函数初始化 EnableDialogs 属性。
将 Initialize 方法添加到类:
public void Initialize(IDatabaseProjectNode projectNode) { ProjectNode = projectNode; // Hook up to a few events ProjectNode.ProjectLoaded += delegate { ShowDialog("In ProjectLoaded Event"); }; }
Initialize 方法标识要应用该功能的项目,然后准备监视 ProjectLoaded 事件。
最后,添加 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)); }
如果用户已使用菜单命令关闭该功能,则该方法将返回。 否则,该方法显示一个对话框。 在您自己的项目功能中,可以执行其他处理而不是显示对话框。
在**“文件”菜单上,单击“保存 SampleProjectFeature.cs”**。
接下来,将生成项目。
生成项目
- 在**“生成”菜单上,单击“生成解决方案”**。
接下来,将收集项目中生成的程序集信息,其中包括版本、区域性和 PublicKeyToken。
收集程序集信息
打开“开始”菜单,依次指向“Microsoft Visual Studio 2010”和“Visual Studio 工具”,然后单击“Visual Studio 命令提示(2010)”。
定位到包含生成的程序集 (SampleProjectFeature.dll) 的文件夹。
键入以下命令行:
SN.EXE -T SampleProjectFeature.dll
记下该公钥标记。 在下一个过程中将会用到它。
接下来,将使用上一过程中收集的程序集信息创建 XML 文件。
创建 XML 文件
在**“解决方案资源管理器”**中,选择 SampleProjectFeature 项目。
在**“项目”菜单上选择“添加新项”**。
在**“模板”窗格中,找到并选择“XML 文件”**项。
在**“名称”文本框中键入 SampleProjectFeature.Extensions.xml,然后单击“添加”**按钮。
此时 SampleProjectFeature.Extensions.xml 文件将添加到**“解决方案资源管理器”**的项目中。
打开 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>
在**“文件”菜单上,单击“保存”**。
接下来,修改 Extensions.xml 文件的属性,以将其包含在 vsixmanifest 中。
将 SampleProductFeature.Extensions.xml 包括在 vsixmanifest 中
在“解决方案资源管理器”中,单击 SampleProjectFeature.Extensions.xml。
在“属性”窗口中,将**“生成操作”属性更改为“内容”**。
将“包括在 VSIX 中”属性更改为**“True”**。
在**“文件”菜单上,单击“全部保存”**。
在“生成”菜单上,单击“生成 SampleProjectFeature.cs”。
将更新 vsixmanifest 文件。 接下来,准备好测试您的项目功能。
测试项目功能
若要测试项目功能,必须先生成该功能,然后可以按 F5 启动 Visual Studio 的实验性生成。
生成并测试数据库项目功能
在**“项目”菜单上,单击“生成”**。
项目应成功生成。
按 F5 在 Visual Studio 的实验性生成中运行您的包。
将出现 Visual Studio 的实验实例。 在“工具”菜单上,出现“Toggle Project Loaded Dialogs”命令。
在**“文件”菜单上,指向“打开”,然后单击“项目/解决方案”**。
浏览至要打开的数据库项目 (.dbproj),然后单击**“打开”**。
随着数据库项目的加载,会出现一个对话框,其中显示消息“Simple Project Feature In ProjectLoaded Event”。
此时,可以自定义您的项目功能,以添加更多功能。
后续步骤
如果将本演练中创建的功能复制为您自己的工作起始点,则必须:
为扩展指定唯一的名称
为扩展指定唯一的 GUID
在使用**“Visual Studio 集成包向导”**创建新包时,将创建一个新的 GUID。
包在注册后方可在 Visual Studio 中的常规实例中使用。 有关 VSPackage 的更多信息,请参见:
请参见
任务
How to: Troubleshoot VSPackages
概念
其他资源
修订记录
日期 |
修订记录 |
原因 |
---|---|---|
2010 年 7 月 |
已对 Extensions.xml 文件进行少量修正以解决客户确定的问题。 |
客户反馈 |