Visual Studio 2005插件编写与安装教程

Tutorial for Visual Studio 2005 Add-in(Integration Package) Dev and Setup or Installation
remex1980 原创于 2007-6-19 19:51:44
原作者: remex1980
原文地址:http://www.msproject.cn:80/ArticleViewer.aspx?ArticleId=73
免费源码下载(转载或翻译的文章只提供下载链接)


最近在做一些VS2005上的插件,在程序安装的时候着实遇到了不少问题,现在把自己的心得记录下来,以便同仁查阅:)

本文将介绍:如何调用、调试一个简单的Visual Studio 2005集成包(Visual Studio 2005 Integration Package),并集中精力详解如何为插件写一个安装程序。


安装Visual Studio 2005 SDK

这个我不想说太多,到微软的网站上下载最新版本,然后安装就好了。这里,我安装的是SDK 4.0,2007年2月发布的版本。

创建工程

创建一个空的工程
创建工程 


添加安装后的插件的例子

到sdk的实例目录,如C:\Program Files\Visual Studio 2005 SDK\2007.02\VisualStudioIntegration\Samples\IDE\CSharp,本文将使用Reference.ComboBox例子,它会给vs 2005的工具栏上添加一个ComboBox下拉框。

拷贝Reference.ComboBox目录到工程文件夹,并添加为其中的一个项目。
添加 

选择插件项目 


此时,有可能出现下面的错误提示"Unable to read the project file 'Reference.ComboBox.csproj'. E:\temp\ToolbarcomboBox\Reference.combobox\Reference.ComboBox.csproj(101,11), The imported project "E:\Tools\Build\Microsoft.VsSDK.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk."
错误提示 

这是因为即将打开的项目是SDK下开发的,需要一个sdk的文件,用记事本打开该项目文件(此处是\Reference.ComboBox\Reference.ComboBox.csproj),到出错的行数,或查找Microsoft.VsSDK.targets,修改全路径到SDK安装目录下。
本例中

  <Import Project="........ToolsBuildMicrosoft.VsSDK.targets" Condition="'$(_NTDRIVE)' == ''"/>


  <Import Project="C:Program FilesVisual Studio 2005 SDK?7.02VisualStudioIntegrationToolsBuildMicrosoft.VsSDK.targets" Condition="'$(_NTDRIVE)' == ''"/>


然后,重复上面的步骤加入插件项目。

调试插件

设置项目属性(右键Reference.ComboBox项目,选择Properties选项),选择Debug项,设置"Start Action"到"Start External Program:",并选择vs 2005 的ide 执行文件位置,本文处为D:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv.exe。设置"start options"中“command line argumnent:”为/rootsuffix Exp
调试插件 

然后,按F5,vs2005会打开另外一个ide。
右键新打开的VS 2005工具栏,选择Combo Box Sample,就可以看到下面的结果了。
工具栏 

插件样子 


添加安装时执行的Installer链接库

添加一个新的project,此处命名为Reference.Combobox.VsSetupAction
添加安装时执行的Installer链接库 


添加一个新的类(Add New Item),继承Installer。本文为VSIDEInstaller。
继承Installer 


右键DevEnvSetupAction.cs文件,选择查看代码View Code

重载Install函数

        public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
if (DevenvIsRunning())	// 判断VS 2005是否正在运行
            {
throw new System.Configuration.Install.InstallException(VS_RUNNING_ERROR_MSG);
}   // end if
            else
{
DevenvSetup();	// 启动VS2005,执行插件安装
            }   // end else
        }

 


判断VS 2005是否正在运行

        private static bool DevenvIsRunning()
{
foreach (Process process in Process.GetProcesses())
{
if (process != null)
{
try
{
foreach (ProcessModule module in process.Modules)
{
if (module != null && module.FileName != null)
{
if (string.Compare(Path.GetFileName(module.FileName), "devenv.exe", StringComparison.InvariantCultureIgnoreCase) == 0)
{
return true;
}   // end if
                            }   // end if
                        }   // end foreach
                    }   // end try
                    catch (System.ComponentModel.Win32Exception)
{
// For some reason we're unable to enumerate the modules of some processes.
                        // Just ignore the error in that case.
                    }   // end catch
                }   // end if
            }   // end foreach

return false;
}   // end DevenvIsRunning
        private static void DevenvSetup()
{
// 读注册表获取vs2005的安装位置
            RegistryKey vsKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\VisualStudio\8.0");
if (vsKey != null)
{
string vsPath = ((string)vsKey.GetValue("InstallDir")) + "devenv.exe";
if (File.Exists(vsPath))
{
//执行devenv.exe /setup
                    Process vsProcess = Process.Start(vsPath, "/setup");
vsProcess.WaitForExit();
}
}
}


为了使上面的代码能够运行,还需要引用下面的三个命名空间

using System.IO;
using System.Diagnostics;
using Microsoft.Win32;

 


添加安装项目

添加一个新项目,并选择类型为Setup Project
Setup Project 


添加文件到安装项目

右键安装项目,在弹出菜单中选择View->File System,在Application Folder中添加上面两个项目的输出文件(右键Add->Project Output)。
添加文件到安装项目 


添加安装时的动作到安装项目

右键安装项目,在弹出菜单中选择View->Custom Actions,在Install文件夹图标中,右键选择A
dd Customer Action
,选择应用程序文件夹中的安装动作项目的输出文件。
添加安装时的动作到安装项目 


添加注册表项到安装项目

插件是需要注册到系统中的,也就是要注册到系统的注册表中,更具体一点说,就是注册到VS2005的注册表项里。

不过问题来了,谁知道该注册那些项?都是那些值呢?
不用担心,VS2005已经给了一个很好的工具,让你知道该注册那些东西了。

获取插件需要的注册表项

运行cmd.exe,到命令行模式,然后调用SDK中的regpkg.exe输出插件包所需要注册的注册表项。
本例中命令行如下:

regpkg.exe /regfile:c:ComboPackage.reg "c:Reference.ComboBox.dll"

首先需要到regpkg.exe所在目录下,本例在C:\Program Files\Visual Studio 2005 SDK\2007.02\VisualStudioIntegration\Tools\Bin位置,输出注册表文件c:\ComboPackage.reg。c:\Reference.ComboBox.dll是插件dll的路径(先编译vs package,然后拷贝到C:,当然,任何一位置都可以,只需要指定其全路径就行)。
获取插件需要的注册表项 


打开上面输出的注册表文件,把对应的项和值,写在安装项目的注册表中就可以了,如下图:
安装项目的注册表 


对应的注册表文件中的值如下:

REGEDIT4
[HKEY_LOCAL_MACHINESoftwareMicrosoftVisualStudio8.0InstalledProductsComboBoxPackage]
@="#100"
"Package"="{0cd316df-48c8-4c28-af14-1be390348214}"
"ProductDetails"="#102"
"PID"="1.0"
"LogoID"="#400"
[HKEY_LOCAL_MACHINESoftwareMicrosoftVisualStudio8.0Packages{0cd316df-48c8-4c28-af14-1be390348214}]
@="Microsoft.Samples.VisualStudio.ComboBox.ComboBoxPackage, Reference.ComboBox, Version=1.0.2726.34182, Culture=neutral, PublicKeyToken=null"
"InprocServer32"="C:\WINDOWS\system32\mscoree.dll"
"Class"="Microsoft.Samples.VisualStudio.ComboBox.ComboBoxPackage"
"Assembly"="Reference.ComboBox, Version=1.0.2726.34182, Culture=neutral, PublicKeyToken=null"
[HKEY_LOCAL_MACHINESoftwareMicrosoftVisualStudio8.0Packages{0cd316df-48c8-4c28-af14-1be390348214}]
"ID"=dword:00000001
"MinEdition"="Standard"
"ProductVersion"="1.0"
"ProductName"="Reference.ComboBox Sample"
"CompanyName"="Microsoft"
[HKEY_LOCAL_MACHINESoftwareMicrosoftVisualStudio8.0Menus]
"{0cd316df-48c8-4c28-af14-1be390348214}"=", 1000, 1"

 

 

注意:为了适应不同的系统环境,可以将InprocServer32中的值,设置成[SystemFolder]mscoree.dll。这样,就可以自动找到对应的系统目录了。

保存工程,编译Setup Project,这样你的插件的安装程序就做好了,是不是很简单?:)

posted on 2007-07-22 22:55  小角色  阅读(1244)  评论(0编辑  收藏  举报