Visual Studio 2005插件编写与安装教程
最近在做一些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。
添加一个新的类(Add New Item),继承Installer。本文为VSIDEInstaller。
右键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。
添加文件到安装项目
右键安装项目,在弹出菜单中选择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,这样你的插件的安装程序就做好了,是不是很简单?:)