我正在尝试在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))
。任何想法???
谢谢!
答案 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对象。它有效,我使用这个系统。