Visual Studio 2010 AddIn DTE2无法正常工作

时间:2012-01-14 18:39:07

标签: visual-studio-2010 visual-studio-addins

我正在尝试在Visual Studio 2010中创建一个AddIn,如下所示:

public void OnConnection(object application, ext_ConnectMode 
  connectMode, object addInInst, ref Array custom)
{
    _applicationObject = (DTE2)application;
    _addInInstance = (AddIn)addInInst;
    EnvDTE80.Windows2 wins2obj;
    AddIn addinobj;
    object ctlobj = null;
    Window newWinobj;

    // A toolwindow must be connected to an add-in, so this line 
    // references one.
    addinobj = _applicationObject.AddIns.Item(1);
    wins2obj = (Windows2)_applicationObject.Windows;

    // This section specifies the path and class name of the windows 
    // control that you want to host in the new tool window, as well as 
    // its caption and a unique GUID.
    string assemblypath = "C:\\temp\\WindowsControlLibrary1.dll";
    string classname = "WindowsControlLibrary1.UserControl1";
    string guidpos = "{426E8D27-3D33-4FC8-B3E9-9883AADC679F}";
    string caption = "CreateToolWindow2 Test";

    // Create the new tool window and insert the user control in it.
    newWinobj = wins2obj.CreateToolWindow2(addinobj, assemblypath, 
      classname, caption, guidpos, ref ctlobj);
    newWinobj.Visible = true;
}

现在我需要将DTE2传递给窗口内新创建的对象(ctlobj)。如果我在ctlobj中声明一个公共变量并在此处设置它,Visual Studio崩溃了,我得到了这个例外:

COM Exception was unhandled
Invalid index. (Exception from HRESULT: 0x8002000B (DISP_E_BADINDEX))

。任何想法???

谢谢!

2 个答案:

答案 0 :(得分:0)

虽然有一种解决方法:

// Get an instance of the currently running Visual Studio IDE.
EnvDTE80.DTE2 dte2;
dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.
GetActiveObject("VisualStudio.DTE.10.0");

答案 1 :(得分:0)

我知道你有来自Nazaf的答案,还有另一种方式,它有点清洁。将dte对象设置为插件class中的公共属性,并将插件类传递给newWinObj

然后您的newWinObj将可以访问addin和dte对象。它有效,我使用这个系统。