VS Shell 总结

推荐:

https://www.cnblogs.com/TianFang/p/3201469.html
https://www.cnblogs.com/TianFang/p/3206721.html

Creating an Extension with a Menu Command
https://docs.microsoft.com/en-us/visualstudio/extensibility/creating-an-extension-with-a-menu-command?view=vs-2015

The Experimental Instance:
https://docs.microsoft.com/en-us/visualstudio/extensibility/the-experimental-instance?view=vs-2015

Sample Code:

https://code.msdn.microsoft.com/site/search?query=VSX&f%5B0%5D.Value=VSX&f%5B0%5D.Type=SearchText&ac=4

https://code.msdn.microsoft.com/CSVSXSaveProject-bfb796b2


Integrated Mode补充知识点:

  • redistributable version: 加载插件的vs(双击vsix)。

You can provide a redistributable version of the Visual Studio integrated shell if Visual Studio is not already installed.

  • Run:  <Visual studio installation path>\Common7\IDE\devenv.exe" /RootSuffix Exp

/RootSuffix Exp不加貌似也可以?

 

一,Shell的两种模式:

  • 集成模式(Integrated Mode):开发的插件包融合到标准的Visual Studio环境,成为Visual Studio的一部分。
  • 独立模式(Isolated Mode):开发的插件包融合进一个独立的Visual Studio框架,可以部署到没有安装Visual Studio的机器中。

以前写的VS插件就是集成式,CCW就是独立式。

针对CCW,二者区别补充:

Both integrated shell and isolated shell can load CCW redistributable packages. We do not need to regenerate CCW package. So the effort is much little than other methods.

CCW must be hosted in Visual Studio just like an add-in tool, CCW cannot be an isolated application. 

Can't remove unused features in Visual Studio.

CCW uses the custom command packages to implement some standard commands such as 'Project open', 'Project save' and 'build' etc. Need to mapping these custom commands to standard visual studio existing commands.

 

二, 可以创建一个Visual Studio Shell Isolated的project作为Shell的宿主,或直接用Visual Studio做宿主。

宿主确定后,其余的都可以创建Visual Studio Packege方式,将功能集成进去。Package提供的是服务(Service)。服务是一些对象,它们提供功能供开发者或者其他package调用。

 

三,提供能服务种类:

  • 界面元素。例如菜单、工具栏、窗口等,开发者可以用它们在用户界面上执行一些动作,显示消息、信息和图片等等。
  • 编辑器。在开发过程中,我们通过编写程序去创建应用程序。编写程序这项任务是由编辑器负责的。Visual Studio 2008有它自己的核心编辑器,但是我们也可以在VSPackage中创建我们自己的编辑器。
  • 设计器。应用程序的创建不只是简单的敲入文本这么简单。我们拥有很多被称为设计器的可视化工具,我们可以利用他们来设计模块、组件、零部件、甚至整个应用系统。著名的例子是WinForm设计器,我们可以用它来创建WinForm的用户界面。
  • 项目。当开发应用程序的时候,我们一般会面向一大堆的文件。项目用来组织这些源文件和资源,并且不是简单的存储这些文件这么简单,它还可以用来编译、调试和发布由源文件创建的产品。

CCW就是项目,CCW里面很多菜单,窗口用的就是界面元素。

 

四,配置的修改

程序基本信息的修改:
通过修改后缀为Application.pkgdef的文件可以修改一些程序的基本信息,主要包括标题,图标,启动画面等。


ApplicationCommands.vsct文件:
这个文件则用于屏蔽系统附送的视图、工具栏、命令等,属于进一步微调性质。

 

五,加载一个Package步骤

  • 创建一个Package project,选toolwindow
  • 把Package加载到Isolated Mode Shell的IDE中,首先需要双击XXXVSIX project里的source.extension.vsixmanifest文件。
  • 在Assert标签页中加入刚才创建的package工程。
  • 在View菜单Other Windows里可以看见它!

上面步骤可以忽略?只需将Package生成的dll和pkgdef文件放到同一目录里?(待尝试)

 

六,如何在IDE中添加一个菜单

  • 为命令创建一个ID、名字和显示的文本,该命令用于显示tool window
  • 创建.vsct文件来设置所谓的command table configuration
  • 为package类添加ProvideMenuAttribute
  • 设置.vsct文件的Build Action
  • 创建菜单项的事件处理函数
  • 建立命令和该事件处理函数的关联
  •  

七,关于GetService的说明:
例:IVsUIShell uiShell = (IVsUIShell)GetService(typeof(SVsUIShell));
IVsUIShell是定义服务的接口;SVsUIShell是所谓的标记类型(markup type)
一个接口也可以被一个或多个服务对象实现

 

八,去掉Integrate VS里自带菜单

上面例子中自定义的command

                // Create the command for the menu item.
                CommandID menuCommandID =
                    new CommandID(GuidList.guidCSVSXSaveProjectCmdSet,
                        (int)PkgCmdIDList.cmdidCSVSXSaveProjectCommandID);
                MenuCommand menuItem =
                    new MenuCommand(MenuItemCallback, menuCommandID);
                mcs.AddCommand(menuItem);

尝试,binding到标准控件的命令,失败。

                var groupGuid = typeof(VSConstants.VSStd97CmdID).GUID;
                var buildSelectid = (int)VSConstants.VSStd97CmdID.BuildSel;
                CommandID myCommandID =
                    //new CommandID(groupGuid, buildSelectid);
                    new CommandID(new Guid("{5efc7975-14bc-11cf-9b2b-00aa00573819}"), 221);
                MenuCommand menuItem2 =
                    new MenuCommand(MenuItemCallback, myCommandID);
                mcs.AddCommand(menuItem2);

又尝试IVsRegisterPriorityCommandTarget接口的方法,灰了,但没有Invisible。自带的标准命令还真难删除掉。。

        protected override void Initialize()
        {
            Trace.WriteLine(string.Format(CultureInfo.CurrentCulture,
                "Entering Initialize() of: {0}", this.ToString()));
            base.Initialize();

            var commandService = GetService(typeof(IVsRegisterPriorityCommandTarget)) as IVsRegisterPriorityCommandTarget;
            if(commandService != null)
            {
                uint cookie;
                commandService.RegisterPriorityCommandTarget(0, new PriorityCommandTarget(), out cookie);
            }

            ...

 

    public class PriorityCommandTarget : IOleCommandTarget
    {
        public int QueryStatus(ref Guid pguidCmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText)
        {
            //var groupGuid1 = typeof(VSConstants.VSStd97CmdID).GUID;
            //var groupGuid2 = typeof(VSConstants.VSStd2KCmdID).GUID;
            
            prgCmds[0].cmdf = (uint)17; //invisble
            return 0;
        }

        public int Exec(ref Guid pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut)
        {
            return 0;
        }
    }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值