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范例。如果本机接口更好,那只是因为它们提供了更好的表面积,而不是更好的功能。是的,我也注意到了它们。现在我需要弄清楚我将如何进入界面。不过非常感谢!你指向的链接非常有用。