2012-01-14 16 views
1

を働いていない:のVisual Studio 2010のアドインDTE2は、私は以下のように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; 
} 

今私は窓(ctlobj)の内側に新しく作成されたオブジェクトにDTE2を渡す必要があります。私はctlobjでパブリック変数を宣言し、ここでそれを設定し、Visual Studioのクラッシュと私はこの例外を取得した場合:

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

。何か案は ???

ありがとうございます!ただし、回避策はあり

答えて

0

:私はあなたがNazafから答えを知っている

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

は、別の方法があるが、それは少しクリーナーです。 dteオブジェクトをアドインclassのパブリックプロパティにして、addinクラスをnewWinObjに渡します。

newWinObjは、addinオブジェクトとdteオブジェクトの両方にアクセスできます。それは動作します、私はこのシステムを使用します。

関連する問題