65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Visual Studio IDE 创建 Vista 小部件(已更新)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (43投票s)

2008年12月1日

CPOL

13分钟阅读

viewsIcon

273229

downloadIcon

19525

本文介绍如何使用 Visual Studio 开发 Vista Gadget。

gadgettoolbarandmenu.png

gadgetmenu.png

引言

在我看来,Visual Studio 中缺乏帮助开发者创建 Vista Gadget 的工具,这很奇怪也很令人失望。我希望这只是暂时的状态,但现在,我想向您展示一些工具,让您仅使用 Visual Studio 2008 或 2010 IDE 即可开发 Vista Gadget。这些工具包括用于创建 Vista Gadget 的 Visual Studio 模板和用于从项目创建 .gadget 文件并运行 Gadget 安装的 Visual Studio 插件。

背景

现在,如果我们想创建一个 Vista Gadget,需要执行以下步骤:

oldprocess.png

  1. 在某个文件夹中创建所有必需的文件夹和重要文件。
  2. 创建一个 zip 存档,其中包含 Gadget 应包含的所有文件夹和文件。
  3. 将存档文件的扩展名从 .zip 更改为 .gadget
  4. 双击运行此文件以启动 Gadget 安装过程。

所有这些操作都可以从 Windows 资源管理器执行。如果您要为某个公司创建一个 Gadget,而该公司的内部政策要求所有程序集和可执行文件都必须经过签名,那么您将不得不使用 cabarc.exesigntool.exe 来签名您的 Gadget。如果没有自动化,创建签名 Gadget 是一项非常枯燥的任务。

那么,如何使用 Visual Studio IDE 自动化所有这些步骤呢?

newprocess.png

您可以在此处找到答案,这是一个为帮助开发 Vista Gadget 而创建的插件。使用此插件,您只需单击菜单项或工具栏按钮,或使用快捷键(Ctrl+R,Ctrl+R,此组合可更改)即可轻松构建签名和未签名 Gadget。那么,如何安装它?为此,我准备了一些安装包。下面,我将介绍如何安装所有这些东西。

安装

在安装包中,我准备了:

  1. AddinDeployment.vsi - Visual Studio 2008 的 Visual Studio 插件安装文件
  2. AddinDeployment2010.vsi - Visual Studio 2010 的 Visual Studio 插件安装文件
  3. CSharpHelloVistaGadgetTemplateDeployment.vsiVBHelloVistaGadgetTemplateDeployment.vsi 文件 – C# 和 VB.NET 的示例 Visual Studio Gadget 模板。实际上,它们不取决于您安装哪个语言的模板,因为 Gadget 只需要 JavaScript 和 VBScript 作为编程语言。所以,这里只有一个区别——您要为哪个语言使用模板,仅此而已。
  4. cabarc.exesigntool.exe – 插件运行所需的附加程序。如果这些应用程序已安装在您的计算机上,您可以设置路径。稍后我将解释如何设置。因此,如果您已经安装了这些应用程序,可以从计算机中删除每个程序。

所以,当您安装好插件和一些模板后,应该为您的未来 Gadget 开发定义一些重要选项。为此,您应该打开插件设置窗口并定义一些参数。

从菜单 Gadget -> Open gadget properties window 中选择,或从工具栏中选择相应的按钮。

opengadgetproperties.png

然后您应该看到下一个窗口。

GadgetPropertiesWindow2.PNG

在此窗口中,您应该定义:

  1. Output Vista Gadget Path – 插件创建 Gadget 后保存 Gadget 的路径。
  2. Cabarc.exe path – cabarc.exe 是一个用于创建 Gadget 文件的应用程序。所以,在此处定义此应用程序的正确路径非常重要。您可以在此找到该工具的官方页面:http://support.microsoft.com/kb/310618。此外,我已在此安装包中为您准备了此工具。所以,您可以选择一个放置本文安装的路径。
  3. Allowed file extensions - 这是一个文件扩展名集合,用于定义您希望放入 Gadget 的文件的类型。
    如果您打算对 Gadget 进行签名,您应该:
    1. 勾选“It will build signed gadget”复选框。
    2. 为此操作定义核心 signtool.exe 实用程序的路径。您可以在此找到有关此工具的更多信息:http://msdn.microsoft.com/en-us/library/8s9b9yaz.aspx
    3. 如果您有现成的 .pfx 文件(个人信息交换文件),请定义其路径。
    4. 如果您没有 .pfx 文件,但有 .pvk.spc.cer 文件之一,则可以使用 pvk2pfk.exe 实用程序创建新的 .pfx 文件。您可以在此找到有关此工具的更多信息:http://msdn.microsoft.com/en-us/library/ff550672.aspx
    5. 也请定义您的 .pfx 文件的密码。

完成输入所有必需信息后,点击“Save”按钮保存这些选项。

另外,我想指出,此处您的项目必须与 cabarc.exesigntool.exe 位于同一个逻辑磁盘上,这一点至关重要。这是上面提到的 Microsoft 控制台应用程序的一个限制。所以,您应该小心,并将这些实用程序严格放置在与您正在处理的项目相同的逻辑磁盘上。

恭喜!现在,您已准备好从 Visual Studio 2008 IDE 使用此插件。

使用插件和模板

完成安装过程后,您就可以使用 Visual Studio IDE 创建自己的 Gadget 了。在这种情况下,您应该打开菜单项:File -> Open -> Web site。
之后,您会看到一个新的打开窗口,您可以在其中选择 HelloWorldVistaGadget 模板。

gadgettemplate.png

点击此模板后,Visual Studio 会打开一个新的网站,其结构将类似于实际的 Gadget 项目结构,如图所示。

gadgetproject.png

在这里,您会发现只有一个非本地元素——它是 web.config 文件。但是,如果您打算使用 RunVistaGadgetAddIn 构建 Gadget,这也不是障碍,因为插件不会将此文件包含在输出的 .gadget 文件中。

在这里,我将不告诉您如何创建 Gadget。您可以在CodeProject 上找到更多关于此过程的良好解释来源,或阅读一本关于此问题的很棒的书。

我只是注意到,在 Visual Studio 中创建好您的精美 Gadget 后,您可以直接单击“Run gadget”按钮,或使用快捷键 Ctrl+R,Ctrl+R,然后您就可以在之前的位置看到您的 Gadget 了。此外,插件还会运行 Gadget 安装过程,您只需在 Gadget 安装对话框(如图所示)中点击“Install”按钮,即可在侧边栏上看到您的 Gadget。

gadgetinstallation.jpg

现在,在点击“Run gadget”按钮后,您总是会看到这个窗口,建议您将 Gadget 安装到 Windows 侧边栏。但我发现当 Gadget 在其代码中使用设置选项时,此场景存在一些问题。在这种情况下,第一次安装后,您可能在将 Gadget 安装到侧边栏时遇到问题。这实际上不是问题,您只需重复安装过程两次即可。我个人正在尝试找出这种行为的原因,但只能发现 Windows 侧边栏一直占用某些 Gadget 文件,并在 Gadget 从侧边栏关闭后未清除资源。所以,如果您找到了解决此问题的方法,请告诉我!

如果您觉得此插件未能满足您的需求,您可以将其关闭。您应该从菜单 Tools -> Add-in manager 中选择。然后在出现的窗口中,取消选中此插件。这样,此插件就不会再打扰您了。

开发

在本文中,我将尝试解释此插件的工作原理。插件的主要部分如何工作。您如何创建自己的模板。最后,我将介绍如何为 Visual Studio 插件和模板准备安装包。

主算法并不复杂。我只用插件源代码中的一小段代码来展示。

if (isHaveLoadedProject())
{
         SaveAllChangedFiles();
         CreateGadget();
         if (isBuildSignGadget())
         {
                  SignGadget();
         }
                        
         RunGadget();
} 

首先,我想提醒您,插件中的所有操作都是命令。当某个命令被调用时,会调用 Exec 方法。Exec 方法是所有命令的通用处理程序。因此,上面提到的代码片段也将从 Exec 方法执行,但仅针对特定命令(在本例中为 RunGadget 命令)。要运行 Gadget,我们需要问一个问题——IDE 中是否已经加载了某个项目(最好是 Gadget 项目)。然后,我们保存此项目中的所有更改文件,之后插件将创建 Gadget 文件。然后它会检查是否应该签名 Gadget。如果应该,它将签名 Gadget。最后,插件会尝试运行 Gadget 安装。

在我看来,最有趣的方法是 CreateGadget() SignGadget()。这两个函数都用于执行外部程序。我在这里应用了一种可能不是最优的,但仍然简单的方法来执行外部程序。因为调用外部程序通常不仅限于此插件中的这两个方法,所以我创建了一个简单的基类,在其中实现了用于调用外部程序的所有类的典型行为。您可以在此处看到类图。

apprunnerhierarchy.jpg

正如您所见,仅在这个插件中,就使用了六个不同的类来调用外部程序。不,我对此并不感到自豪。但如果系统中已经存在某个东西,为什么我还要重新发明呢?所以,对我来说,使用一个已有的应用程序比自己创建一个要容易得多。此层次结构的结构包括一个基抽象类 ApplicationRunner。当您继承此类时,应重写两个主要方法 GetAppArgruments() GetOutputAndRunApplication()。第一个 GetAppArguments 方法应返回一个 string ,其中包含参数,就像在控制台应用程序中调用一样(例如,执行 cmd.exe cd /? 时,上面提到的方法应该只返回 cd /? 而不带 *.exe 文件)。第二个 GetOutputAndRunApplication 方法将使用适当的参数调用基类。

例如,我们来看下一个例子。对于这个例子,我们想打开侧边栏设置窗口。这是我们可以选择合适的 Vista Gadget 并将其安装到侧边栏的窗口。您可以在下图看到此窗口。

gadgetcontrol.jpg

为此,我们可以调用 cmd 命令,例如:“C:\Program Files\Windows Sidebar\sidebar.exe /showgadgets”。更多关于侧边栏命令的信息可以在这篇博文中找到。从 C# 代码中,我们可以使用上面提到的 ApplicationRunner 基类来完成此任务。所以,我们需要创建一个新类,该类应继承自 ApplicationRunner 类并重写两个方法。在此插件中,我创建了 SidebarSettingsRunner 类。您可以在下面的代码中看到此类的代码。

class SidebarControlConsoleRunner: ApplicationRunner
{
        public SidebarControlConsoleRunner(DTE2 applicationObject)
            : base(applicationObject, false){ }

        public SidebarControlConsoleRunner(DTE2 applicationObject, bool isRunAsWinApp)
            : base(applicationObject, isRunAsWinApp){ }

        public override string GetAppArguments()
        {
            String GadgetArgs = "  /showgadgets";
            return GadgetArgs;
        }

        public override string GetOutputAndRunApplication()
        {           
            base.CalledApplicationPath = "c:\\" +
Environment.SpecialFolder.ProgramFiles + Path.DirectorySeparatorChar +
"Windows Sidebar\\sidebar.exe";
           
            return base.GetOutputAndRunApplication();
        }    
 } 

您可以看到,对于 GetAppArguments 方法,我们将参数定义为“/cpl”。对于 GetOutputAndRunApplication 方法,我们定义了 sidebar.exe 文件的应用程序路径,并在应用程序运行后返回输出 string 。此外,我们可以在此代码片段中使用此类。

SidebarControlConsoleRunner sccr = 
	new SidebarControlConsoleRunner(applicationObject, true);
String AppOutput = sccr.GetOutputAndRunApplication(); 

其中 applicationObject 是此插件的一个全局对象,您可以在当前插件实例的 OnConnection 事件处理程序中定义它。

此功能可以从工具栏按钮或菜单项“Open Vista Sidebar Control Console”调用。因此,此外,我想解释一下如何为我们的插件添加这样的可能性。

为此,我们应该为 OnStartupComplete 插件实例的事件处理程序添加一些代码。首先,我们应该理解,在任何插件中,我们都应该使用命令模式来编程任何操作。并且对于任何操作,我们都应该定义一个特定的 Command 对象实例。Command 类描述了插件的某个操作。在这种情况下,我们想定义一个用于打开 Vista Sidebar Control Console 的操作。所以,我们创建了一个内部 Visual Studio Command 类的新的实例,然后在其构建方法中为其定义了一些属性。

然后,我们定义了要使用的命令集合。在这种情况下,我们定义了 commandBars menuCommandBar 集合。这里 commandBar CommandBar 对象的一个集合,代表容器应用程序中的命令栏。CommandBar 对象代表可以帮助我们获取 Visual Studio IDE 指定控件集合的对象。在这种情况下,GadgetTemporaryCommandBarPopup 控件集合将指定标准 Visual Studio IDE 菜单中的新菜单组“Gadget”。使用上面定义的用于我们操作(OpenVistaSidebarControlConsoleCommand)的命令,我们可以向“Gadget”组菜单添加新的菜单项。下面,您可以看到使用 C# 代码添加新工具栏、工具栏按钮、菜单组和菜单项的完整代码片段。

 public void OnStartupComplete(ref Array custom)
{
        Command OpenVistaSidebarControlConsoleCommand = null;
        CommandBar menuCommandBar;
        CommandBar GadgetTemporaryToolbar;
        CommandBars commandBars;
        CommandBarButton OpenVistaSidebarControlConsoleCommandBarButton;
        CommandBarControl GadgetToolsCommandBarControl;
        CommandBarPopup GadgetTemporaryCommandBarPopup;        

        try
        {           
             OpenVistaSidebarControlConsoleCommand =
		applicationObject.Commands.Item(addInInstance.ProgID + "." +
		OPEN_VISTA_SIDEBAR_CONTROL_CONSOLE_COMMAND_NAME, 3);
        }
        catch
        {

        }
        object[] contextGUIDS3 = new object[] { };

        // Add the command if it does not exist
        if (OpenVistaSidebarControlConsoleCommand == null)
        {               
            OpenVistaSidebarControlConsoleCommand =
		applicationObject.Commands.AddNamedCommand(addInInstance,
		OPEN_VISTA_SIDEBAR_CONTROL_CONSOLE_COMMAND_NAME, "Open Vista Sidebar
		Control Console", "Open Vista Sidebar Control Console", true, 548, ref
		contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported +
		(int)vsCommandStatus.vsCommandStatusEnabled);
        }
        commandBars = (CommandBars)applicationObject.CommandBars;
        menuCommandBar = commandBars["MenuBar"];
          

        // Add a new toolbar with a button on it
         
        GadgetTemporaryToolbar =
        	commandBars.Add("VistaGadgetDevelopmentToolbar",
        	MsoBarPosition.msoBarTop, System.Type.Missing, true);

        // Change the button style, which must be done casting the control to a button
  
        OpenVistaSidebarControlConsoleCommandBarButton =
        (CommandBarButton)OpenVistaSidebarControlConsoleCommand.AddControl
		(GadgetTemporaryToolbar,
        GadgetTemporaryToolbar.Controls.Count + 1);
        OpenVistaSidebarControlConsoleCommandBarButton.Style = 
				MsoButtonStyle.msoButtonIcon;

        // Add a new command bar popup with a button on it
  
        GadgetTemporaryCommandBarPopup =
		(CommandBarPopup)menuCommandBar.Controls.Add
				(MsoControlType.msoControlPopup,
		System.Type.Missing, System.Type.Missing, position, true);
       	GadgetTemporaryCommandBarPopup.CommandBar.Name = 
			"VistaGadgetDevelopmentCommandBarPopup";
       	GadgetTemporaryCommandBarPopup.Caption = "Gadget";         
  
                          
      	OpenVistaSidebarControlConsoleCommand.AddControl
		(GadgetTemporaryCommandBarPopup.CommandBar,
		GadgetTemporaryCommandBarPopup.Controls.Count + 1);            
}

Visual Studio IDE 的一些很酷的功能可以为开发人员节省时间。其中之一就是创建和使用 Visual Studio 模板用于项目和项。您可以准备自己的项目模板,并在几分钟内打开整个项目,而无需编写任何代码字符串。模板的真正好处在于创建自己的实例的简单性。对于 Team Edition 用户来说,最简单的方法是:他们只需准备模板项目并选择菜单项 File -> Export Template...。其余的人可以使用 Ron Petrusha 写的优秀文章"Creating Visual Studio Project Templates"中描述的方法来创建模板。

插件开发中的另一个有趣主题是部署。您可以创建和共享项以在 Visual Studio 中使用。其中也包含用于插件部署的项。使用此项,您可以轻松地将插件分发给其他开发人员。要将其与 Visual Studio 一起使用,您可以将项打包到 .vsi 文件中,该文件可以通过 Visual Studio Content Installer 进行安装。Visual Studio Content Installer 会自动将插件项复制到开发人员计算机上的正确目录,以便这些项出现在 Visual Studio 的正确对话框中。

要使用 Visual Studio Content Installer 安装您的社区组件,您必须为该组件创建一个 .vscontent 文件。创建 .vscontent 文件后,您应该将组件文件和 .vscontent 文件压缩成一个单独的 .zip 文件,并将文件名扩展名从 .zip 更改为 .vsi。您可以在此文章中找到有关创建插件包和创建 .vscontent 文件更多信息。

此外,我想提一本关于创建 Visual Studio 插件的优秀书籍,当我想到更新这篇文章时,它一直是我灵感的源泉。有一本Keyvan Nayyery 的《Professional Visual Studio Extensibility》。我非常感激他写了这样一本有趣且对我非常有用的书。

结论

在本文中,我向您展示了如何创建 Visual Studio Vista Gadget 项目模板并从 Visual Studio IDE 中使用它。此外,我还向您展示了如何安装和使用 RunVistaGadget Visual Studio 插件,以便从 Visual Studio IDE 运行 Vista Gadget。为什么使用 Visual Studio IDE 创建 Vista Gadget 如此方便?

  • 您可以通过选择所需的项目来打开 Vista Gadget 项目以及创建 Gadget 文件所需的所有文件。
  • 您可以使用您喜欢的源代码控制程序来管理 Gadget 文件的版本和历史记录。
  • 您可以使用 Visual Studio IDE 的优点,例如语法高亮、JavaScript 代码的自动完成表达式等。
  • 您可以在不离开 Visual Studio IDE 的情况下,自动化运行新版本 Gadget 的过程。

历史

文章已于 2010 年 11 月 20 日更新。此次更新进行了以下更改:

  • Visual Studio 2010 的插件安装
  • 修复了项目路径包含空格的 bug。

源代码也可在 Codeplex 上找到。

这是本文的第一个版本 - RunVistaGadget.aspx。如果您无法将项目和 Microsoft 的实用程序放在同一个逻辑磁盘上,此版本可能有用。但旧版本不支持签名,并且运行界面不佳。无论如何,它可能对某人有所帮助。

© . All rights reserved.