C# 不使用DTE访问生成事件

C# 不使用DTE访问生成事件,c#,visual-studio,visual-studio-2019,vsix,C#,Visual Studio,Visual Studio 2019,Vsix,捕获构建事件时,您只需收听DTE2.events.BuildEvents事件。但是,不使用DTE就可以收听这些事件。我从一些人和消息来源那里读到并听到,如果可能的话,由于其糟糕的实现或其他原因,您通常应该避免使用DTE。一般来说,如果您试图自动化Visual Studio,您可以使用DTE,这是标准的自动化方法,或者使用本机接口。本机接口启动“IVs…”,例如IVsSolution。在这两种情况下,这项技术都很古老,记录也很差。正如您所建议的,本机解决方案确实会更好 话虽如此,对于在我需要的构建

捕获构建事件时,您只需收听
DTE2.events.BuildEvents
事件。但是,不使用
DTE
就可以收听这些事件。我从一些人和消息来源那里读到并听到,如果可能的话,由于其糟糕的实现或其他原因,您通常应该避免使用
DTE

一般来说,如果您试图自动化Visual Studio,您可以使用DTE,这是标准的自动化方法,或者使用本机接口。本机接口启动“IVs…”,例如IVsSolution。在这两种情况下,这项技术都很古老,记录也很差。正如您所建议的,本机解决方案确实会更好

话虽如此,对于在我需要的构建上运行的任务,我最终使用了DTE,它可以更容易编程并可靠地工作


我发现mztools.com网站上同样古老的文章(不是工具!)在这方面非常有用,当然还有MSDN文档。将“mztools”添加到您的谷歌搜索中。例如,什么(Google'mztools build events')是有用的,即使它可以追溯到2013年。

我只想分享实际工作并实现我所需的代码。这是通过@Rich N的帮助实现的,谢谢你的帮助。事实上,这比我想象的要容易,过程总是一样的

  • GetService
    方法获取
    Svs…
    类,并将其强制转换到相应的接口
  • 然后使用
    advice…
    方法附加事件处理程序类
  • //首先,使用GetService方法通过SVsSolutionBuildManager获取IVsSolutionBuildManager
    var service=GetService(typeof(SVsSolutionBuildManager))作为IVsSolutionBuildManager;
    //附加事件
    service.advisionUpdateSolutionEvents(new Events(),out var cookie)
    //处理事件回调的类
    公共类事件:IVsUpdateSolutionEvents
    {
    //接口中的实现方法
    }
    
    DTE
    是Visual Studio的主要应用程序对象。我还没有看到/听到任何关于所谓“糟糕的实现”的说法,但我怀疑它来自于一个局外人对VisualStudio的COM起源和基础的看法。表面积是由这些事件接口的
    IDispatch
    性质决定的。我承认这不漂亮。但我不认为这有他们想象的那么糟糕。说句俏皮话,
    DTE
    是发布这些事件的工具,所以不,没有其他方式来倾听它们。@madreflection好吧,我想这回答了我的问题。我认为您可以使用
    DTE
    来解决问题,因为您可以获得
    IVsSolutionEvents
    而无需直接使用
    DTE2.Events
    对象。我不知道“本机”接口。微软是抽象和间接的大师。完全有可能它们只是对旧版本的抽象。以
    IVsSolution.GetGuidOfProject
    为例。它仍然返回一个HRESULT,并为
    Guid
    结果使用一个输出参数。如果它们是真的.NET接口,我怀疑它们是否会继续使用COM范例。如果本机接口更好,那只是因为它们提供了更好的表面积,而不是更好的功能。是的,我也注意到了它们。现在我需要弄清楚我将如何进入界面。不过非常感谢!你指向的链接非常有用。