我应该在Visual Studio加载项中附加解决方案或项目事件的位置?

awj*_*awj 5 events extensibility add-in visual-studio

任何人都可以提出补充解决方案或项目活动,如ProjectAdded,到Visual Studio插件的最佳地点?

如果我这样做,当外接连接那么就没有加载的解决方案,所以我怎么能知道当一个解决方案已经被加载?

例如,如果我编写一个事件来处理正在添加的项目项目,我应该在哪里附加它?本次活动将通过该项目被解雇,而这又通过该解决方案,所以我不能当外接连接,因为没有解决外接所连接时连接的事件.

在另一方面,如果我在执行exec()事件中添加他们,那么我需要做的检查,如该事件是否已经被连接,我敢肯定,必须有连接事件和Exec之间建立更合适的方法有时()事件.

tak*_*krl 5

您可能很久以前就已经想到了这一点,但无论如何:您可以从OnConnection下面显示的内部设置您的事件,这是Addin的Connect类的片段(假设您正在使用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
}
Run Code Online (Sandbox Code Playgroud)

重点是,要连接所需的解决方案和项目事件,如果已经加载了解决方案或项目,那么这一点并不重要.它们不附加到任何特定的解决方案或项目,它们由Visual Studio对象模型提供,并嵌入在EnvDTE命名空间中.

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

虽然有几个渔获量:

  • 这是很重要的是你到SolutionEvents类作为您的连接类中的一个成员变量的引用,否则该事件将永远不会触发,(见这里).
  • 您需要确保检查connectMode传入的参数OnConnection.这会被不同的参数多次调用,如果你以错误的方式执行,你可能会多次连接事件,这肯定会成为一个问题.此外,通常任何Addin IDE,如菜单和东西,都是从内部设置的OnConnection,因此如果你做得不对,最终可能会出现重复的菜单项.

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

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

找到名为MZ-Tools文章系列(关于加载项)的部分,并查看其中包含的内容.