VS 2005 Add-in开发随笔

    最近在改进NBear的EntityDesignToEntityVsPlugin,给EntityDesignToEntityVsPlugin增加右键菜单功能,在选择EntryDesign项目时,点击右键时弹出相应的菜单,通过点击菜单项触发项目编译并根据实体设计类生成相应的实体类代码,在这里给大家分享一段在VS 2005 Add-in中实现右键菜单的代码:    
   
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
        {
            _applicationObject 
= (DTE2)application;
            _addInInstance 
= (AddIn)addInInst;
            CommandBars cmdBars 
= (CommandBars)(_applicationObject.DTE.CommandBars);
            CommandBar vsBarProject 
= cmdBars["Project"];

            CommandBarPopup menu 
= vsBarProject.Controls.Add(MsoControlType.msoControlPopup, Missing.Value, Missing.Value, 1trueas CommandBarPopup;
            menu.Caption 
= "DemoAddIn";
            menu.TooltipText 
= "";

            CommandBarControl menuItem 
= menu.Controls.Add(MsoControlType.msoControlButton, 1""1true);
            menuItem.Tag 
= "BuildTest";
            menuItem.Caption 
= "BuildTest";
            menuItem.TooltipText 
= "BuildTest";
            menuItemHandler 
= (CommandBarEvents)_applicationObject.DTE.Events.get_CommandBarEvents(menuItem);
            menuItemHandler.Click 
+= new _dispCommandBarControlEvents_ClickEventHandler(MenuItem_Click);   
            
        }

        
private void MenuItem_Click(object commandBarControl, ref bool handled, ref bool cancelDefault)
        {
            _applicationObject.ExecuteCommand(
"Build.BuildSelection"""); 
        }

        
public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom)
        {
            CommandBars cmdBars 
= (CommandBars)(_applicationObject.DTE.CommandBars);
            CommandBar vsBarProject 
= cmdBars["Project"];
            vsBarProject.Controls[
"DemoAddIn"].Delete(null);
        }

上面代码实现的功能是当你在VS 2005中选择一个项目,点击右键出现一个DemoAddin的菜单,选择该菜单中的BuildTest菜单项,会调用编译命令编译当前项目。
在开发时,遇到了这样的问题:
开始时,把menuItemHandler定义局部变量,点击BuildTest菜单项时,有时不执行MenuItem_Click方法,有时第一次点击时执行,但再点击就不执行。
后来把menuItemHandler定义为类的成员变量才解决问题,具体原因目前还不清楚。

完整代码下载:http://files.cnblogs.com/dudu/DemoAddin.rar
如果你想手动添加上面的代码,Visual Studio 2005提供了Visual Studio Add-in模板,在新建项目时选择Other Project Types>Extensibility>Visual Studio Add-in,新建一个Visual Studio Add-in项目,将上面的代码添加到Connect类中。
编译后,将项目文件夹中的DemoAddin.AddIn及DemoAddin.dll复制到VS 2005的Addins文件夹中(默认在“我的文档\Visual Studio 2005\Addins”),然后打开VS 2005,在Tools>Add-in Manager中启用该Add-In,如果想默认启用该Add-in,可以在DemoAddin.AddIn文件中将LoadBehavior改为1。

参考文章:
Explorer - A Visual Studio 2005 add-in which interacts with Windows Explorer
posted @ 2007-02-06 14:38 dudu 阅读(6943) 评论(17) 编辑 收藏

 回复 引用 查看   
#1楼 2007-02-06 16:25 chy710      
沙发,收藏..
 回复 引用 查看   
#2楼 2007-02-06 18:33 喝酒的猫      
开发又落后了!
悲哀

 回复 引用   
#3楼 2007-02-06 20:53 张有为[未注册用户]
dudu:
你好,我是张有为,趣摘网(http://www.quzhai.com)的创始人,你的博客很有趣,已经被收藏到趣摘网了,有很多的我们的用户都很喜欢你的博客。如果你要查看你的博客被收藏的详细信息,只需在趣摘网首页的"搜索"功能里,输入你的博客的链接地址(http://www.cnblogs.com/dudu/news/2006/11/28/574798.html),然后点击"搜索"即可。
我们想请你在博客上评论一下趣摘网,给我们提些意见和建议,你的提醒是我们前进的不竭动力!
趣摘网以发现网上的有趣内容为目标,她把互联网上有趣的网站和网页进行了分类摘录,只需轻轻点击,就按用户的兴趣把有趣的网页呈现给他。用户可以在这里浏览、收藏、评论别人发现的有趣网页,也可以将自己发现的有趣网页提交进来呈现给其他人。使用趣摘网您还可以发现跟您兴趣相同的朋友,进而和朋友们一起去分享交流有趣的网页。
趣摘网现在的alexa排名5万,每天ip访问量10万个。
如果你在博客上写了评论,请发信通知我:zhangyouwei@quzhai.com,我一定会认真阅读并给以回复。
祝你的博客越来越好!
趣摘网CEO 张有为
2月6日

 回复 引用 查看   
#4楼 2007-02-07 08:53 海丰      
插一句话,分发rar文件是需要授权费用的,不知道dudu的rar程序是否为正版?
 回复 引用 查看   
#5楼 2007-02-07 10:17 shenfx      
我把你rar中的addin和dll文件考过去,在AddinManager中,勾选确定后,报错。
---------------------------
Microsoft Visual Studio
---------------------------
The Add-in 'DemoAddin' failed to load or caused an exception.
Would you like to remove this Add-in?
If you choose yes, the file it was loaded from, 'D:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Addins\DemoAddin.AddIn', will be renamed.

Error Message: Unspecified error


Error number: 80004005
---------------------------
是(Y) 否(N)
---------------------------
啥原因啊?

 回复 引用 查看   
#6楼 2007-02-07 10:27 妖居      
@shenfx
替dudu回答一下……
addin的dll需要注册的。使用regsvr32注册为COM组件就可以用了。

 回复 引用 查看   
#7楼[楼主] 2007-02-07 10:48 dudu      
@妖居
VS 2005 add-in不需要注册。

 回复 引用 查看   
#8楼[楼主] 2007-02-07 10:51 dudu      
@海丰
什么地方有这个授权规定?

 回复 引用 查看   
#9楼[楼主] 2007-02-07 10:58 dudu      
@shenfx
你用的VS 2005是什么版本的?

 回复 引用 查看   
#10楼 2007-02-08 09:35 shenfx      
@dudu
Microsoft Visual Studio 2005 Team Suite

 回复 引用 查看   
#11楼[楼主] 2007-02-08 14:07 dudu      
@shenfx
我用的是Team Edition,没遇到你所说的问题。

 回复 引用   
#12楼 2008-01-03 10:56 December[未注册用户]
我报错是无法复制文件.dll文件,正在由另一个程序使用
 回复 引用   
#13楼 2008-11-18 14:23 焦磊[未注册用户]
楼主知不知道,在右键菜单前如何添加上自定义的图标?
 回复 引用   
#14楼 2009-09-08 09:47 madog[未注册用户]
还好看到楼主的提示,我也遇到commandbar没有触发click的问题,想了一下为什么不能放在方法的声明这个handle,我猜想是因为如果声明在方法里,由于最后是将引用传递给了非托管代码,在方法执行完的时候gc会将这个临时做为一个没有引用的变量而即时销毁,那么传给非托管代码的指针就变成一个空指针,所以事件才没有被触发的。