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






4.78/5 (10投票s)
一个用于为 devenv 命令提示符创建自定义开关的库(可扩展性示例)。
引言
这个简单框架的目的是为 devenv 命令开发开关,你可以从 Visual Studio 2005 提示符启动它们。你可以使用 devenv 命令从 VS2005 提示符执行许多操作。例如,如果你键入 devenv "项目名称/解决方案名称",而不带任何开关,则会打开一个新的 VS 实例,并加载该项目/解决方案。如果你键入 devenv /setup,则描述 VSPackages 的菜单、工具栏等的环境资源元数据将与 VS 环境合并。以下是 devenv 命令提示符的所有开关:MSDN。
这个框架的诞生是因为我必须从提示符打开一个网站。据我所知,没有简单的方法可以做到这一点(例如,devenv "网站文件夹")。在互联网上,我发现有一种方法可以创建一个宏,安装在 VS 中,然后使用 devenv /Command 运行它。因此,我决定寻找一种更好的方法,特别是那种将来也可能很有用的方法。开发一个包对我来说是个绝妙的主意。因此,我搜索了一些关于创建自定义开关和运行它们的相关文档。以下是如何实现自定义开关:MSDN。
必备组件
- 要使用框架的 VS 2005 版本,您必须安装 Visual Studio 2005 SDK。
- 要使用框架的 Orcas 版本,您必须下载 Orcas 和 Visual Studio Orcas SDK。Orcas 版本与 2005 版本相同,只是重新编译了一下。您可以从 Microsoft 在虚拟机(Windows Server 2003)上下载 Orcas。
- 对 VSPackage/插件的基本了解。
图例
这里有一个类图和一个序列图,展示了包如何与开关框架进行通信。
类图
序列图
如何开发自定义开关
要创建自定义开关,您必须从 CustomSwitch
层继承一个新的类。创建一个构造函数,该构造函数接受 ISwitchPackage
接口、开关名称和命令行参数,并调用基类。然后,重写 Executing
函数并实现您想要的功能。为了监视开关执行,CustomSwitch 有两个事件:BeforeExecuting
和 AfterExecuting
。
这里是 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
}
要触发事件,基类 CustomSwitch
的 Execute
方法实现如下
///
/// 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 能够识别您的开关。
在 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
有一个配置属性,因此您可以创建自己的自定义配置并使用它。