Visual Studio 2010 надстройка DTE2 не работает - PullRequest
1 голос
/ 14 января 2012

Я пытаюсь создать AddIn в Visual Studio 2010, как показано ниже:

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 голосов
/ 08 сентября 2012

Я знаю, что у вас есть ответ от Назафа, есть другой способ, он немного чище.Сделайте объект dte общедоступным свойством в вашем надстройке class и передайте класс надстройки в newWinObj.

Тогда ваш newWinObj будет иметь доступ как к объектам надстройки, так и к объектам dte.Это работает, я использую эту систему.

0 голосов
/ 15 января 2012

Есть обходной путь, хотя:

// 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");
...