Visual Studio插件开发
一般使用过Visual Studio开发程序的人,都会觉得Visual Studio功能十分强大,开发环境提供了相当丰富的工具以及代码感知等近乎完美的上下文环境,极大地方便了程序员编写代码。其实,除此之外,Visual Studio还提供了强大的扩展功能,以满足特殊的客户需求。
VisualStudio提供了三种不同级别的扩展:宏、外接程序和向导即插件以及 Visual Studio行业合作伙伴 (VSIP) 计划。下面我重点介绍一下,在QAF 开发平台中广泛使用的插件开发技术。
一、 创建插件项目:
创建项目,按下图选择项目类型
按向导指示操作,操作完成后生成插件项目。项目中自动引用了EnvDTE及其后续版本,
我们在插件开发过程中,使用到的主要对象就是DTE对象,利用它我们几乎能编程控制在Visual Studio中的任何东西。
二、插件开发中的几个关键方法的介绍:
同时项目中还生成了一个Connect.cs文件,这个文件就是任何Visual Studio插件的起动点,它实现了一些关键接口,例如IDTExtensibility2, IDTCommandTarget,在几个关键方法中提供一些启动代码,最重要的一个方法就是OnConnection(object application, ext_Co
nnectMode connectMode, object addInInst, ref Array custom)。当启动一个插件时,第一个调用的方法就是它,你可以在其中增加一些初始化代码。(例如,增加一个工具菜单项)。在Onconnection方法中,首先我们要注意的这三行代码:
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
if (connectMode == _cm_AfterStartup || connectMode == _cm_Startup)
第一行就是缓存一个DTE对象,这是在Visual Studio启动插件时由它提供的,第二行就是缓存插件自己的一个实例,在编写的插件代码中会经常调用它,第三行是一个if语句,当插件启动后,涉及到的条件的处理,Visual Studio通常会两次启动插件,一次就是设置自己的UI,如菜单项,菜单栏按钮等等;另外,当插件真正运行后,插件被再次启动,这可以发生在两种不同情况下(第一是当VS启动后自动运行,或者是在VS启动后通过其它进程来运行)。If语句中两个条件含义你可以参照下表:
成员名称 | 说明 |
ext_cm_AfterStartup | 外接程序是在 Visual Studio 启动后加载的。 |
ext_cm_CommandLine | 外接程序是从命令行加载的。 |
ext_cm_External | 外接程序是由外部客户端加载的。(Visual Studio 不再使用此设置。) |
ext_cm_Solution | 外接程序是在解决方案中加载的。 |
ext_cm_Startup | 外接程序是在 Visual Studio 启动时加载的。 |
ext_cm_UISetup windows开发平台 | 外接程序是为用户界面设置而加载的。 |
下面我QAF平台中的模型浏览器为例,介绍一下,要在插件启动时创建出自己的工具窗口,在OnConnection方法中该如何编写代码。
首先,在解决方案中在创建一个项目,项目类型选类库。
然后设置项目属性,点击Assembly Information按钮,在弹出窗口中,选中 Make assembl
y COM-Visible 复选框。使该项目在编译后生成COM组件,因为Visual Studio的插件是 COM 对象。
然后在该项目中再创建一个普通的用户控件 QAFModelBrowser,该控件的主要功能是,
用树形控件显示指定文件夹下的所有文件,并添加右键菜单来操作文件,具体的代码就不再介绍了。
在OnConnection方法中,增加如下代码,即可在View菜单中加入QAF模型浏览器的菜单项。
#region 增加菜单项
#region 增加菜单项
try
{
//将一个命令添加到 Commands 集合:
//Commands2 commands = (Commands2)_applicationObject.Commands;
Command commandModuleBrowser = null;
try
{
commandModuleBrowser = commands.Item("ClassLibrary1.QAFModelBrowser", 59); // 其中ClassLibrary1.QAFModelBrowser 为 模型浏览器控件的命名空间
if (commandModuleBrowser != null)
commandModuleBrowser.Delete();
}
catch
{
}
commandModuleBrowser = commands.AddNamedCommand2(_addInInstance, "QAFModelBrowser", "QAF模型浏览器", "QAF模型浏览器", true, 59, ref contextGUIDS, (int)vsCommandStatus.vsCommandSt
atusSupported + (int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);
//将对应于该命令的控件添加到“工具”菜单:
if ((commandModuleBrowser != null) && (toolsPopup != null))
{
commandModuleBrowser.AddControl(toolsPopup.CommandBar, 1);
}
}
catch(Exceptipn ex)
{
MessageBox.Show(ex.Message);
}
#endregion
#region 创建QAF模型浏览器工具窗口
需要在Conect.cs类中定义一下变量
string guidpos = "{6449302f-11db-4343-b947-9395d7d754a8}";
string classFullName = " ClassLibrary1.QAFModelBrowser ";
string caption = "QAF模型浏览器";
public Window newQAFModelBrowserWinobject;
public EnvDTE80.Windows2 wins2object;
public object ctlNewQAFModelBrowserObj = null;
public QAFModelBrowser qAFModelBrowser;
newQAFModelBrowserWinobject = wins2object.CreateToolWindow2(_addInInstance, ClassLibrary1生成的Dll文件的路径,
classFullName, caption, guidpos, ref .ctlNewQAFModelBrowserObj);
qAFModelBrowser = ctlNewQAFModelBrowserObj as QAFModelBrowser;
if (qAFModelBrowser != null)
{
newQAFModelBrowserWinobject.Visible = true;
}
#endregion
至此,QAF模型浏览器工具窗口的菜单项,以及首次加载已经完成了。要想在工具窗口关
闭后,通过菜单项重新打开,还需要编写以下两个方法:QueryStatus和Exec 其中 QueryStatus为设置菜单显示状态,Visual Studio每次执行完一个命令后都会调用该方法,判断菜单项的可见性。Exec方法为,点击菜单项后,Visual Studio为执行菜单命令提供的扩展方法。
public void QueryStatus(string commandName, vsCommandStatusTextWanted neededText, ref vsCommandStatus status, ref object commandText)
{
if (neededText == vsCommandStatusTextWanted.vsCommandStatusTextWantedNone)
{
switch (commandName)
{
case " ClassLibrary1.QAFModelBrowser":
{
status = (vsCommandStatus)vsCommandStatus.vsCommandStatusSupported | vsCommandStatus.vsCommandStatusEnabled;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论