Click here to Skip to main content
15,894,955 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
I have created a new Visual Studio Addin for create and add my custom tab in the Visual Studio toolbox and add new items (controls) to my custom tab. Codes work for add new tab to the Visual Studio toolbox, but not work for add new items (controls) to my tab.
My Visual Studio Addin code is:
C#
using System;
using Extensibility;
using EnvDTE;
using EnvDTE80;
using EnvDTE90;
using EnvDTE100;
using System.Windows.Forms;
namespace MyAddin1
{
    /// <summary>The object for implementing an Add-in.</summary>
    /// <seealso class='IDTExtensibility2' />
    public class Connect : IDTExtensibility2
    {
        /// <summary>Implements the constructor for the Add-in object. Place your initialization code within this method.</summary>
        public Connect()
        {
        }

        /// <summary>Implements the OnConnection method of the IDTExtensibility2 interface. Receives notification that the Add-in is being loaded.</summary>
        /// <param term='application'>Root object of the host application.</param>
        /// <param term='connectMode'>Describes how the Add-in is being loaded.</param>
        /// <param term='addInInst'>Object representing this Add-in.</param>
        /// <seealso class='IDTExtensibility2' />
        public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
        {
            _applicationObject = (DTE2)application;
            _addInInstance = (AddIn)addInInst;
            // Pass the applicationObject member variable to the code example.
            ToolboxExample(_applicationObject);
        }

        public void ToolboxExample(DTE2 dte)
        {
            ToolBox tlBox = null;
            ToolBoxTabs tbxTabs = null;
            ToolBoxTab3 tbxTab = null;
            try
            {
                tlBox = (ToolBox)(dte.Windows.Item(Constants.vsWindowKindToolbox).Object);
                tbxTabs = tlBox.ToolBoxTabs;
                tbxTab = (ToolBoxTab3)tbxTabs.Add("MRS");
                tbxTab.Activate();
                tbxTab.ToolBoxItems.Add("FloorsGrouping", @"C:\Windows\Microsoft.NET\assembly\GAC_MSIL\WindowsFormsControlLibrary2\v4.0_1.0.0.0__197889249da45bfc\WindowsFormsControlLibrary2.dll", vsToolBoxItemFormat.vsToolBoxItemFormatDotNETComponent);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("ERROR: " + ex.Message);
            }
        }

        private DTE2 _applicationObject;
        private AddIn _addInInstance;
    }
}

Following line of code not works:
C#
tbxTab.ToolBoxItems.Add("FloorsGrouping", @"C:\Windows\Microsoft.NET\assembly\GAC_MSIL\WindowsFormsControlLibrary2\v4.0_1.0.0.0__197889249da45bfc\WindowsFormsControlLibrary2.dll", vsToolBoxItemFormat.vsToolBoxItemFormatDotNETComponent);

I change
C#
tbxTab.ToolBoxItems.Add

with:
C#
tbxTabs.Item("MRS").ToolBoxItems.Add

However, it didn't work for me. Even I change
C#
@"C:\Windows\Microsoft.NET\assembly\GAC_MSIL\WindowsFormsControlLibrary2\v4.0_1.0.0.0__197889249da45bfc\WindowsFormsControlLibrary2.dll"

with following code lines and test them one by one:
C#
@"E:\Rostami\Saino\WindowsFormsControlLibrary2.dll"

and
C#
"WindowsFormsControlLibrary2.FloorsGrouping, WindowsFormsControlLibrary2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=197889249da45bfc"

However, it didn't work for me again.
My custom control main class name is FloorsGrouping, and its display name is:
C#
[DisplayName("Floors Group")]

And its assembly name in the GAC is:
C#
[Editor("WindowsFormsControlLibrary2.FloorsGrouping, WindowsFormsControlLibrary2, Version=1.0.0.0, Culture=neutral,  PublicKeyToken=197889249da45bfc", typeof(UITypeEditor))]

I searched the internet for any solutions, and I only find several solutions that describe adding new tab to the Visual Studio toolbox and adding controls to tab just possible from Visual Studio Addin.
Posted
Updated 10-Oct-12 1:37am
v2
Comments
BillWoodruff 7-Oct-12 23:54pm    
Please do search CP for resources when you submit a question like this. Dave Kerr has an August, 2012 series here on CP about extending VS Studio: part two of his series is specifically about AddIns: http://www.codeproject.com/Articles/324611/Extending-Visual-Studio-Part-2-Creating-Addins

By the way, I am not sure if your question here really involves what is usually meant by the word "AddIn" for Visual Studio, or whether you are just dealing with the question about how to add a Tab to the ToolBox with some Controls "under" the Tab. The word "AddIn" in my experience with VS Studio usually means extending the functionality of Visual Studio in some way: ReSharper, CodeSmart, JustCode, etc. are AddIns, for example.
MRS1989 8-Oct-12 3:09am    
tnx 4 ur comment. I've said, "... by Visual Studio Addin" in question title because changing visual studio toolbox is only possible by Visual Studio Addin projects.

1 solution

I found the solution and could add my custom tab to the Visual Studio toolbox and add my custom controls to my custom tab with Windows Forms Application project and not from Visual Studio Add-in project. I describe it as follows:
In Windows Forms Application project, first, we must create an instance of Visual Studio IDE. Then, must create a temporary Windows Forms Application project and next, must add our custom tab to the Visual Studio toolbox and add our custom controls to our custom tab.
My codes are as following for Class1.cs:
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using EnvDTE;
using EnvDTE80;
using System.IO;

namespace InstallToolboxControls
{
    // Definition of the IMessageFilter interface which we need to implement and 
    // register with the CoRegisterMessageFilter API.
    [ComImport(), Guid("00000016-0000-0000-C000-000000000046"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
    interface IOleMessageFilter // Renamed to avoid confusion w/ System.Windows.Forms.IMessageFilter
    {
        [PreserveSig]
        int HandleInComingCall(int dwCallType, IntPtr hTaskCaller, int dwTickCount, IntPtr lpInterfaceInfo);

        [PreserveSig]
        int RetryRejectedCall(IntPtr hTaskCallee, int dwTickCount, int dwRejectType);

        [PreserveSig]
        int MessagePending(IntPtr hTaskCallee, int dwTickCount, int dwPendingType);
    }

    class Program : IOleMessageFilter
    {
        [DllImport("ole32.dll")]
        private static extern int CoRegisterMessageFilter(IOleMessageFilter newFilter, out IOleMessageFilter oldFilter);
        static string ctrlPath = "WindowsFormsControlLibrary2.FloorsGrouping, WindowsFormsControlLibrary2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=197889249da45bfc";//@"C:\Windows\Microsoft.NET\assembly\GAC_MSIL\WindowsFormsControlLibrary2\v4.0_1.0.0.0__197889249da45bfc\WindowsFormsControlLibrary2.dll";//@"E:\Rostami\Saino\Program\Tests\WindowsFormsControlLibrary2\WindowsFormsControlLibrary2\bin\Debug\WindowsFormsControlLibrary2.dll";

        [STAThread]
        public static void Toolbox(string arg)
        {
            Program program = new Program();
            program.Register();
            if (arg.Equals("Install", StringComparison.CurrentCultureIgnoreCase))
            {
                program.InstallControl();
            }
            else if (arg.Equals("UnInstall", StringComparison.CurrentCultureIgnoreCase))
            {
                program.UninstallControl();
            }
            program.Revoke();

            // to ensure the dte object is actually released, and the devenv.exe process terminates.
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }

        void InstallControl()
        {
            // Create an instance of the VS IDE,
            Type type = System.Type.GetTypeFromProgID("VisualStudio.DTE.10.0");
            DTE dte = (DTE)System.Activator.CreateInstance(type, true);

            // create a temporary winform project;
            string tmpFile = Path.GetFileNameWithoutExtension(Path.GetTempFileName());
            string tmpDir = string.Format("{0}{1}", Path.GetTempPath(), tmpFile);
            Solution2 solution = dte.Solution as Solution2;
            string templatePath = solution.GetProjectTemplate("WindowsApplication.zip", "CSharp");
            Project proj = solution.AddFromTemplate(templatePath, tmpDir, "dummyproj", false);

            // add the control to the toolbox.
            EnvDTE.Window window = dte.Windows.Item(EnvDTE.Constants.vsWindowKindToolbox);
            EnvDTE.ToolBox toolbox = (EnvDTE.ToolBox)window.Object;
            EnvDTE.ToolBoxTab myTab = toolbox.ToolBoxTabs.Add("Saino");
            myTab.Activate();
            myTab.ToolBoxItems.Add("MyUserControl", ctrlPath, vsToolBoxItemFormat.vsToolBoxItemFormatDotNETComponent);
            dte.Solution.Close(false);
            Marshal.ReleaseComObject(dte);
            //Console.WriteLine("Control Installed!!!");
        }

        void UninstallControl()
        {
            Type type = System.Type.GetTypeFromProgID("VisualStudio.DTE.10.0");
            DTE dte = (DTE)System.Activator.CreateInstance(type, true);
            EnvDTE.Window window = dte.Windows.Item(EnvDTE.Constants.vsWindowKindToolbox);
            EnvDTE.ToolBox toolbox = (EnvDTE.ToolBox)window.Object;
            EnvDTE.ToolBoxTab myTab = toolbox.ToolBoxTabs.Item("Saino");
            myTab.Activate();
            myTab.Delete();
            Marshal.ReleaseComObject(dte);
            //Console.WriteLine("Control Uninstalled!!!");
        }

        void Register()
        {
            IOleMessageFilter oldFilter;
            CoRegisterMessageFilter(this, out oldFilter);
        }

        void Revoke()
        {
            IOleMessageFilter oldFilter;
            CoRegisterMessageFilter(null, out oldFilter);
        }

        #region IOleMessageFilter Members
        public int HandleInComingCall(int dwCallType, IntPtr hTaskCaller, int dwTickCount, IntPtr lpInterfaceInfo)
        {
            return 0; //SERVERCALL_ISHANDLED
        }

        public int RetryRejectedCall(IntPtr hTaskCallee, int dwTickCount, int dwRejectType)
        {
            if (dwRejectType == 2) // SERVERCALL_RETRYLATER
            {
                return 200; // wait 2 seconds and try again
            }
            return -1; // cancel call
        }

        public int MessagePending(IntPtr hTaskCallee, int dwTickCount, int dwPendingType)
        {
            return 2; //PENDINGMSG_WAITDEFPROCESS
        }
        #endregion
    }
}

And my codes are as following for Form1.cs:
C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using InstallToolboxControls;

namespace WindowsFormsApplication12
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            InstallToolboxControls.Program prg = new InstallToolboxControls.Program();
            InstallToolboxControls.Program.Toolbox("Install");
        }
    }
}
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900