安装组件到 ToolBox 的命令行应用程序






4.31/5 (6投票s)
2005年9月20日
2分钟阅读

31500

384
一篇关于将组件安装到 VS 工具箱的文章。
引言
本文介绍了一个控制台应用程序,它允许创建或删除工具箱选项卡,并用一个或多个程序集的组件填充它。本文扩展了 Serkan Inci 的文章(虽然我没有从他的代码开始,但我找到了激活属性窗口的技巧)。
生成的 EXW 文件可以轻松地从任何安装程序运行,隐藏其命令行窗口。
背景
阅读本文需要对 Visual Studio .NET 和 C# 有基本的了解。 熟悉 DTE 和反射会有所帮助。
使用代码
要使用 EXE 文件安装 DLL,只需启动
ElToolBoxInstaller.exe -i TabName FirstDllFullPath
[SecondDllFullPath] [ThirdDllFullPath] ….
注意您必须传递程序集的完整路径。
要使用 EXE 文件删除选项卡,只需启动
ElToolBoxInstaller.exe -u TabName
设计规范如下:
- 程序集的全部组件将被安装到同一个选项卡上。
- 通过单个命令,可以将多个程序集的组件安装到同一个选项卡下。
- Visual Studio 在安装期间将被关闭(软件会检查这一点)。
- 所有版本的 Visual Studio 都需要更新。
关于第 1 点,我可能会更新代码以允许将同一程序集的组件发送到不同的选项卡(到目前为止,我的产品不需要这样做,但我认为有一种简单的方法是将所有组件安装到一个选项卡,然后移动它们)。
第 2 点很重要,可以避免多次重新打开 DTE。
第 3 点是一个限制,有助于防止不良结果和不必要的复杂性(您可以轻松更新代码以链接一个打开的 Visual Studio 实例,但您应该更新所有实例的工具箱,并且我发现开发环境处于调试模式时会出现一些奇怪的效果)。
首先,程序会检查是否正在运行 Visual Studio 实例,查找“devenv”进程。
private static bool IsVSActive()
{
//"Checking if Vs is open"
try
{
Process[] processArray1 = Process.GetProcesses();
for (int num1 = 0; num1 < processArray1.Length; num1++)
{
Process process1 = processArray1[num1];
if (string.Compare(process1.ProcessName, "devenv",
true, CultureInfo.InvariantCulture) == 0)
{
return true;
}
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
return false;
}
验证没有 VS 实例正在运行后,程序将继续执行。
高级函数是 InstallOnVs
,它接收一个 ProgId 字符串作为参数(例如:“VisualStudio.DTE.7.1”用于 Visual Studio 2003)和一个字符串数组,该数组必须包含
- –i(用于安装)或 –u(用于卸载)
- 选项卡名称
- 一个或多个程序集的完整路径
InstallOnVs
首先创建一个工具箱窗口
//"Get DTE type"
Type type1 = Type.GetTypeFromProgID(progId);
// Version of VS is not installed
if (type1 == null) return;
// Create DTE
dte1 = (DTE) Activator.CreateInstance(type1);
// Get ToolBox Window
Window window1 = dte1.Windows.Item(Constants.vsWindowKindToolbox);
box1 = (ToolBox) window1.Object;
private static void tabActivate()
{
//Basically a trick to fix some strange behaviour of DTE
dte1.ExecuteCommand("View.PropertiesWindow", "");
tab2.Activate();
//"Select first tab item"
tab2.ToolBoxItems.Item(1).Select();
}
最后,所有程序集都使用 AddtoToolBox
加载。
private static void AddToToolBox(string assemblyfullpath)
{
try
{
//Check if file exists
FileInfo info1 = new FileInfo(assemblyfullpath);
if (info1.Exists)
{
tab2.ToolBoxItems.Add(tabName, assemblyfullpath,
vsToolBoxItemFormat.vsToolBoxItemFormatDotNETComponent);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message.ToString());
}
}
虽然任务不复杂,但我无法找到一个“开箱即用”的解决方案,我希望现在这能节省您的时间。
历史
首次提交版本 - 2005 年 9 月 7 日。