1

Visual Studioツールボックスでカスタムタブを作成および追加し、カスタムタブに新しいアイテム(コントロール)を追加するための新しいVisualStudioアドインを作成しました。コードは、Visual Studioツールボックスに新しいタブを追加するためには機能しますが、タブに新しいアイテム(コントロール)を追加するためには機能しません。

私のVisualStudioアドインコードは次のとおりです。

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;
    }
}

次のコード行は機能しません:

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

私が変える

tbxTab.ToolBoxItems.Add

と:

tbxTabs.Item("MRS").ToolBoxItems.Add

しかし、それは私にはうまくいきませんでした。私も変わる

@"C:\Windows\Microsoft.NET\assembly\GAC_MSIL\WindowsFormsControlLibrary2\v4.0_1.0.0.0__197889249da45bfc\WindowsFormsControlLibrary2.dll"

次のコード行を使用して、それらを1つずつテストします。

@"E:\Rostami\Saino\WindowsFormsControlLibrary2.dll"

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

しかし、それは私にとって再びうまくいきませんでした。

私のカスタムコントロールのメインクラス名はFloorsGroupingで、その表示名は次のとおりです。

[DisplayName("Floors Group")]

また、GACでのアセンブリ名は次のとおりです。

[Editor("WindowsFormsControlLibrary2.FloorsGrouping, WindowsFormsControlLibrary2, Version=1.0.0.0, Culture=neutral,  PublicKeyToken=197889249da45bfc", typeof(UITypeEditor))]

インターネットで解決策を検索しましたが、Visual Studioツールボックスに新しいタブを追加したり、VisualStudioアドインから可能なタブにコントロールを追加したりすることを説明している解決策はいくつか見つかりました。

4

1 に答える 1

1

解決策を見つけ、カスタム タブを Visual Studio ツールボックスに追加し、Visual Studio アドイン プロジェクトではなく、Windows フォーム アプリケーション プロジェクトを使用してカスタム コントロールをカスタム タブに追加することができました。次のように説明します。

Windows フォーム アプリケーション プロジェクトでは、まず、Visual Studio IDE のインスタンスを作成する必要があります。次に、一時的な Windows フォーム アプリケーション プロジェクトを作成する必要があります。次に、カスタム タブを Visual Studio ツールボックスに追加し、カスタム コントロールをカスタム タブに追加する必要があります。

Class1.csのコードは次のとおりです。

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
    }
}

Form1.csのコードは次のとおりです。

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");
        }
    }
}
于 2012-10-10T12:18:16.400 に答える