65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.31/5 (6投票s)

2005年9月20日

2分钟阅读

viewsIcon

31500

downloadIcon

384

一篇关于将组件安装到 VS 工具箱的文章。

引言

本文介绍了一个控制台应用程序,它允许创建或删除工具箱选项卡,并用一个或多个程序集的组件填充它。本文扩展了 Serkan Inci 的文章(虽然我没有从他的代码开始,但我找到了激活属性窗口的技巧)。

生成的 EXW 文件可以轻松地从任何安装程序运行,隐藏其命令行窗口。

背景

阅读本文需要对 Visual Studio .NET 和 C# 有基本的了解。 熟悉 DTE 和反射会有所帮助。

使用代码

要使用 EXE 文件安装 DLL,只需启动

ElToolBoxInstaller.exe -i TabName FirstDllFullPath 
                   [SecondDllFullPath]  [ThirdDllFullPath] ….

注意您必须传递程序集的完整路径。

要使用 EXE 文件删除选项卡,只需启动

ElToolBoxInstaller.exe -u TabName

设计规范如下:

  1. 程序集的全部组件将被安装到同一个选项卡上。
  2. 通过单个命令,可以将多个程序集的组件安装到同一个选项卡下。
  3. Visual Studio 在安装期间将被关闭(软件会检查这一点)。
  4. 所有版本的 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)和一个字符串数组,该数组必须包含

  1. –i(用于安装)或 –u(用于卸载)
  2. 选项卡名称
  3. 一个或多个程序集的完整路径

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 日。

© . All rights reserved.