Re: VisualStudio.NET & Add-Ins
От: MaxMP Россия  
Дата: 14.11.02 14:57
Оценка: 21 (2)
Здравствуйте Dioran, Вы писали:

D>Доброе время суток!


D>Очень хочется написать add-in к vs что бы контекстное меню на файле проекта (определённого типа) соддержало свой, дополнительный пунктик, что бы потом, с этим файлом, можно было бы что то сделать.


D>Может кто нибудь знает как это делается, или хотя бы где можно найти информацию по этому вопросу.


D>Заранее спасибо.


Вот простейший пример, который создает команду в контекстном меню для файла в солюшен эксплорере. Желательно
сначало создать проект Other Projects/Extensibility Project/Visual Studio.NET Add-in.

using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;    

using EnvDTE;
using Extensibility;
using Microsoft.Office.Core;

namespace MyAddin1
{

[GuidAttribute("19F6C50D-22A4-42E0-8B35-36165B1B0405"), ProgId("ExpAddin.Connect")]
public class Connect : IDTExtensibility2, IDTCommandTarget
{
    private _DTE dte;
    private AddIn addInInstance;

    public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, 
                                    object addInInst, ref System.Array custom)
    {
        try
        {
            dte = (_DTE)application;
            addInInstance = (AddIn)addInInst;
            
            if(connectMode == Extensibility.ext_ConnectMode.ext_cm_UISetup)
            {
                // Clean up first.
                foreach(Command c in  dte.Commands)
                {
                    if(c.Name != null && c.Name.StartsWith("ExpAddin.Connect"))
                    {
                        c.Delete();
                    }
                }
                
                object[] contextGUIDS = new Object[]{};
                Commands commands = dte.Commands;
                _CommandBars commandBars = dte.CommandBars;
                Command command = commands.AddNamedCommand(
                                                        addInInstance, 
                                                        "TestCommand", 
                                                        "Test Command", 
                                                        "Executes the command for Addin", 
                                                        true,
                                                        59, 
                                                        ref contextGUIDS, 
                                                        (int)vsCommandStatus.vsCommandStatusEnabled | (int)vsCommandStatus.vsCommandStatusSupported);

                CommandBar commandBar = (CommandBar)commandBars["Item"];
                CommandBarControl commandBarControl = command.AddControl(commandBar, 1);
            }
        }
        catch(Exception ex)
        {
            MessageBox.Show("Exception: " + ex);
        }
    }

    public void OnDisconnection(Extensibility.ext_DisconnectMode disconnectMode, ref System.Array custom)
    {
    }

    public void OnAddInsUpdate(ref System.Array custom)
    {
    }

    public void OnStartupComplete(ref System.Array custom)
    {
    }

    public void OnBeginShutdown(ref System.Array custom)
    {
    }
    
    public void QueryStatus(string commandName, EnvDTE.vsCommandStatusTextWanted neededText, ref EnvDTE.vsCommandStatus status, ref object commandText)
    {
        if(neededText == EnvDTE.vsCommandStatusTextWanted.vsCommandStatusTextWantedNone)
        {
            status = (vsCommandStatus)vsCommandStatus.vsCommandStatusSupported|vsCommandStatus.vsCommandStatusEnabled;
        }
    }

    public void Exec(string commandName, EnvDTE.vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
    {
        try
        {
            handled = false;
            if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
            {
                // Do something.
                MessageBox.Show("Hello!");
                handled = true;
                return;
            }
        }
        catch(Exception ex)
        {
            MessageBox.Show("exception " + ex);
        }
    }
}

}


И небольшой reg файл для регистрации аддина:
REGEDIT4
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio\7.0\AddIns\ExpAddin.Connect]
"CommandPreload"=dword:1
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.