【问题标题】:Where should I attach solution or project events in my Visual Studio add-in?我应该在我的 Visual Studio 加载项中的何处附加解决方案或项目事件?
【发布时间】:2010-08-12 19:54:22
【问题描述】:

谁能建议将解决方案或项目事件(例如 ProjectAdded)添加到 Visual Studio 加载项的最佳位置?

如果我在加载项连接时执行此操作,则没有加载任何解决方案,那么我如何知道何时加载了解决方案?

例如,如果我编写一个事件来处理正在添加的项目项,我应该在哪里附加它?该事件将由项目触发,而该事件又由解决方案触发,因此我无法在加载项连接时附加事件,因为加载项连接时没有解决方案。

另一方面,如果我将它们添加到 Exec() 事件中,那么我需要进行检查,例如该事件是否已经附加,并且我确信在连接事件之间的某个时间必须有一个更简洁的方法和 Exec() 事件。

【问题讨论】:

    标签: visual-studio events add-in extensibility


    【解决方案1】:

    您可能很久以前就想到了这一点,但无论如何:您可以在 OnConnection 中设置您的事件,如下所示,这是 Addin 的 Connect 类的 sn-p(假设您使用的是 c#):

    using System;
    using System.Globalization;
    using System.Reflection;
    using System.Resources;
    using EnvDTE;
    using EnvDTE80;
    using Extensibility;
    using Microsoft.VisualStudio.CommandBars;
    
    namespace MyAddin1
    {
      /// <summary>The object for implementing an Add-in.</summary>
      /// <seealso class='IDTExtensibility2' />
      public class Connect : IDTExtensibility2, IDTCommandTarget
      {
        private DTE2 _applicationObject;
        private AddIn _addInInstance;
        private SolutionEvents _solutionEvents;
    
        public void OnConnection(object application, ext_ConnectMode connectMode,
              object addInInst, ref Array custom)
        {
          _applicationObject = (DTE2)application;
          _addInInstance = (AddIn)addInInst;
    
          // check the value of connectMode here, depending on your scenario
          if(connectMode == ...)
            SetupEvents();
        }
    
        private void SetupEvents()
        {
          // this is important ...
          _solutionEvents = _applicationObject.Events.SolutionEvents;
    
          // wire up the events you need
          _solutionEvents.Opened += new _dispSolutionEvents_OpenedEventHandler(_solutionEvents_Opened);
          _solutionEvents.AfterClosing += new _dispSolutionEvents_AfterClosingEventHandler(_solutionEvents_AfterClosing);
          _solutionEvents.ProjectAdded += new _dispSolutionEvents_ProjectAddedEventHandler(_solutionEvents_ProjectAdded);
        }
    
      // add procedures to handle the events here, plus any other
      // handling you need, ie. OnDisconnection and friends
    }
    

    要点是,要连接您需要的解决方案和项目事件,解决方案或项目是否已加载并不重要。它们不附加到任何特定的解决方案或项目,它们由 Visual Studio 对象模型提供并嵌入在 EnvDTE 命名空间中。

    无论如何,做任何其他事情都没有多大意义,因为您可以配置一个插件以在 VS 启动时加载,在这种情况下,永远不会加载任何解决方案/项目。

    不过有一些问题:

    • 重要将 SolutionEvents 类的引用保留为连接类中的成员变量,否则为 the events will never fire, (see also here)。李>
    • 您需要确保检查传递给OnConnectionconnectMode 参数。这会使用不同的参数多次调用,如果您以错误的方式执行此操作,您可能会多次连接事件,这绝对是一个问题。此外,通常任何 Addin IDE(例如菜单和其他东西)都是在 OnConnection 中设置的,因此如果操作不当,最终可能会出现重复的菜单项。

    这里有一些指针,提供的一些代码是 VB 代码,以防你正在寻找:

    最后,这是一个文章列表,其中大约 70% 涵盖了有关插件的基本和高级主题:

    找到标题为 MZ-Tools 文章系列(关于加载项) 的部分并查看其中的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多