DTE2事件未触发。

10

在尝试开发我的第一个VS Addin时,我遇到了在触发DTE2事件方面的问题。

基本上,DocumentOpened和LineChanged事件因某种原因无法触发。我错过了哪个重要的部分?

namespace TestAddin {
  public class Connect : IDTExtensibility2 {
    private AddIn _addInInstance;
    private DTE2 _applicationObject;

    public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) {
      _applicationObject = (DTE2) application;
      _addInInstance = (AddIn) addInInst;

      _applicationObject.Events.DocumentEvents.DocumentOpened += InitializeFoldingOnDocument;
      _applicationObject.Events.TextEditorEvents.LineChanged += UpdateFoldingOnDocument;
    }

    private void UpdateFoldingOnDocument(TextPoint startpoint, TextPoint endpoint, int hint) {
      RegionFolding(_applicationObject.ActiveDocument);
    }

    private void InitializeFoldingOnDocument(Document document) {
      RegionFolding(document);
    }

    private void RegionFolding(Document _document) {
      // Do the folding [...]
    }

    // Other IDTExtensibility2 Members [...]
  }
}
2个回答

22
你需要保存DocumentEvents类,否则它们可能会被释放或垃圾回收。

在我的情况下。

private SolutionEvents solutionEvents;

public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
    Globals.DTE = (DTE2)application;
    Globals.Addin = (AddIn)addInInst;

    solutionEvents = Globals.DTE.Events.SolutionEvents;
    solutionEvents.Opened += new _dispSolutionEvents_OpenedEventHandler(SolutionEvents_Opened);
    solutionEvents.BeforeClosing += new _dispSolutionEvents_BeforeClosingEventHandler(SolutionEvents_BeforeClosing);
}

1
作为一名初学者的VSX开发人员,这个问题困扰了我很久。如果有人感兴趣,这是有关此主题的Microsoft KB问题文章链接:http://support.microsoft.com/kb/555430 - Dan Nolan
我不知道你是怎么想出来的,但这太棒了! - justin.m.chase

0

我找到了一个不同的解决方案来解决这个问题。

在进行事件订阅之前,我对我的DTE对象进行了装箱和拆箱操作。最终证明这是我的罪魁祸首。虽然这不是你的问题,但它可能会帮助其他遇到类似问题的人;并且知道这一点很好,这样你就不会犯我所犯的同样的错误,这需要极长的时间才能解决。

请参见:http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/eb1e8fd1-32ad-498c-98e9-25ee3da71004


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接