2012-03-15 66 views
1

我建立一个Visual Studio 2010的插件,并试图加载解决方案时,钩到一个事件。SolutionEvents对于Visual Studio 2010插件不火

基本上就是我发现的是,SolutionEvents.Opened似乎正是我要找的,但是听它的OnConnection似乎并不奏效:

public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) 
{ 
    applicationObject = (DTE2)application; 
    var outputWindow = (OutputWindow)applicationObject.Windows.Item(Constants.vsWindowKindOutput).Object; 
    outputWindowPane = outputWindow.OutputWindowPanes.Add("My Pane"); 
    applicationObject.Events.SolutionEvents.Opened += SolutionEventsOnOpened; 
    outputWindowPane.OutputString("Connected"); 
} 

private void SolutionEventsOnOpened() 
{ 
    outputWindowPane.OutputString("SolutionEventsOnOpened"); 
} 

outputed唯一的一点是“连接的”。

我试图听SolutionItemsEvents.ItemAdded和SolutionEvents.ProjectAdded也是他们不火。

我应该初始化的事件在其他地方? (注意:我已经安装了R·,也许是knowed造成的问题?)

回答

3

发现这里的解决方案:http://blogs.microsoft.co.il/blogs/kolbis/archive/2007/11/22/hooking-up-to-the-solution-events.aspx

基本上,你需要在你的加载类范围的SolutionEvents和事件声明会员变量并分配它们,然后通过它引用事件处理程序。例如。

private Events2 m_events; 
    private SolutionEvents m_solutionEvents; 

然后在的OnConnection处理器(当你的插件被初始化)做到这一点:

m_application = Application as DTE2; 

    m_events = (Events2)m_application.Events; 
    m_solutionEvents = m_events.SolutionEvents; 

最后,电缆铺设工作的解决方案打开/ AfterClosing事件,如下所示:

m_solutionEvents.Opened += m_openSolution; 
    m_solutionEvents.AfterClosing += m_closeSolution; 

然后事件将会发生。

我相信这样做的原因是因为否则活动/ SolutionEvents对象得到改变或GC'd(或两者;-)。

HTH