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

一个用于 Visual Studio 提示符和 devenv 命令的简单 Switch 框架

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.78/5 (10投票s)

2007 年 4 月 20 日

CPOL

3分钟阅读

viewsIcon

54272

downloadIcon

362

一个用于为 devenv 命令提示符创建自定义开关的库(可扩展性示例)。

Main Screenshot

引言

这个简单框架的目的是为 devenv 命令开发开关,你可以从 Visual Studio 2005 提示符启动它们。你可以使用 devenv 命令从 VS2005 提示符执行许多操作。例如,如果你键入 devenv "项目名称/解决方案名称",而不带任何开关,则会打开一个新的 VS 实例,并加载该项目/解决方案。如果你键入 devenv /setup,则描述 VSPackages 的菜单、工具栏等的环境资源元数据将与 VS 环境合并。以下是 devenv 命令提示符的所有开关:MSDN

这个框架的诞生是因为我必须从提示符打开一个网站。据我所知,没有简单的方法可以做到这一点(例如,devenv "网站文件夹")。在互联网上,我发现有一种方法可以创建一个宏,安装在 VS 中,然后使用 devenv /Command 运行它。因此,我决定寻找一种更好的方法,特别是那种将来也可能很有用的方法。开发一个包对我来说是个绝妙的主意。因此,我搜索了一些关于创建自定义开关和运行它们的相关文档。以下是如何实现自定义开关:MSDN

必备组件

  1. 要使用框架的 VS 2005 版本,您必须安装 Visual Studio 2005 SDK。
  2. 要使用框架的 Orcas 版本,您必须下载 Orcas 和 Visual Studio Orcas SDK。Orcas 版本与 2005 版本相同,只是重新编译了一下。您可以从 Microsoft 在虚拟机(Windows Server 2003)上下载 Orcas。
  3. 对 VSPackage/插件的基本了解。

图例

这里有一个类图和一个序列图,展示了包如何与开关框架进行通信。

类图

Class Diagram

序列图

Sequence Diagram

如何开发自定义开关

要创建自定义开关,您必须从 CustomSwitch 层继承一个新的类。创建一个构造函数,该构造函数接受 ISwitchPackage 接口、开关名称和命令行参数,并调用基类。然后,重写 Executing 函数并实现您想要的功能。为了监视开关执行,CustomSwitch 有两个事件:BeforeExecutingAfterExecuting

这里是 OpenWebSiteSwitch 的代码示例

/// <summary />
/// Manages opening WebSite.
/// </summary />

internal class OpenWebSiteSwitch : CustomSwitch
{
    #region Constructors

    /// <summary />
    /// Default constructor.
    /// </summary />

    /// <param name="package" />Package that launch command.</param />
    /// <param name="name" />Custom switch name.</param />
    /// <param name="parameters" />Custom switch parameters.</param />

    public OpenWebSiteSwitch(ISwitchPackage package, string name, string[] parameters)
           : base(package, name, parameters)
    {
    }

    #endregion

    #region Protected Functions

    /// 
    /// Executes the command.
    /// 

    protected override void Executing()
    {
        VsWebSite.VSWebPackage webPackage = 
          Package.DTE2.GetObject("WebPackage") as VsWebSite.VSWebPackage;

        try
        {
            webPackage.OpenWebSite(Parameters[0], 
              VsWebSite.OpenWebsiteOptions.OpenWebsiteOption_None, false);
        }
        catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show("Exception type: " + 
                   ex.GetType().ToString() + ". WebSite at path {0} cannot be loaded!", 
                   Parameters[0]);
        }
    }

    #endregion
}

要触发事件,基类 CustomSwitchExecute 方法实现如下

/// 
/// Checks parameters and executes the command.
/// 

virtual public void Execute()
{
    if (!CheckContext())
        throw new SwitchException(Resources.IllegalSwitchOrOption);

    if (BeforeExecuting != null)
        BeforeExecuting(this, null);

    Executing();

    if (AfterExecuting != null)
        AfterExecuting(this, null);
}

某些操作只能在 VS 完全打开后执行,例如打开项目或网站。因此,您只能在启动完成事件后执行开关。

在包的 Initialize 函数的末尾

EnvDTE80.DTE2 dte2 = GetService(typeof(SDTE)) as EnvDTE80.DTE2;
dte2.Events.DTEEvents.OnStartupComplete += new 
   EnvDTE._dispDTEEvents_OnStartupCompleteEventHandler(DTEEvents_OnStartupComplete);

在事件中

IVsAppCommandLine commandLine = GetService(typeof(SVsAppCommandLine)) as IVsAppCommandLine;
CustomSwitchEngine customSwitchEngine = new CustomSwitchEngine(this);
Collection<CustomSwitch> customSwitches = customSwitchEngine.GetCustomSwitches(commandLine);

foreach (CustomSwitch customSwitch in customSwitches)
    customSwitch.Execute();

IVsAppCommandLine 是 VS 和使用命令行参数所需的接口。

实现自定义开关后,您必须更新注册表,以便 Visual Studio 能够识别您的开关。

Registry

HKLM/SOFTWARE/Microsoft/VisualStudio/8.0/AppCommandLine 中,您必须添加一个与您的开关同名的键,并添加以下值

  • Arguments:开关可以拥有的参数数量。
  • DemandLoad:如果开关存在于命令行中,则加载该程序包,值为 1。
  • HelpString:您可以在提示符下为 /? 指定帮助字符串。例如:myswitch /?。
  • Package:与该开关相关的程序包的 GUID。

要测试您的开关,您可以加载 SimpleSwitchFramework 的代码(参见先决条件),打开项目属性,然后在 Debug 选项卡中,在 /rootsuffix Exp 之后添加 /AboutSwitch。当您按 F5 时,另一个 VS 实例将运行,并在启动完成后,会出现一个消息框。

注意:在源代码文件夹中,有两 (2) 个 .reg 文件用于更新注册表。

配置

正如您所见,有一个 Configuration 层,它允许您加载 VS 可以识别的所有可能的自定义开关。CustomSwitchEngine 有一个配置属性,因此您可以创建自己的自定义配置并使用它。

© . All rights reserved.