c# - Visual Studio 生成操作的当前类型 - Microsoft.VisualStudio.Shell.Interop

标签 c# visual-studio build visual-studio-extensions envdte

在某些扩展中,我们实现了 IVsUpdateSolutionEvents2IVsSolutionBuildManager2用于向 AdviseUpdateSolutionEvents 注册调用者

例如,在任何构建操作开始之前调用:

public int UpdateSolution_Begin(ref int pfCancelUpdate)
{
    ...
}

但是,还需要获取当前构建 Action 的状态或类型,例如:build/rebuild/clean/deploy

可用和已知变体:

构建事件

随着Events.BuildEvents我可以订阅 OnBuildBegin,例如:

_buildEvents.OnBuildBegin += new _dispBuildEvents_OnBuildBeginEventHandler((vsBuildScope Scope, vsBuildAction Action) => {
    buildType = (BuildType)Action;
});

并在任何地方使用 buildType,因为 vsBuildAction提供所有必要的信息

但是UpdateSolution_Begin/UpdateSolution_StartUpdate首先使用建议方法调用 作为优先级,结果 buildType 设置得太晚了..

我们也可以使用这个 OnBuildBegin 代替 UpdateProjectCfg_Begin/UpdateSolution_StartUpdate,但是我们的处理也需要尽快与优先调用者

IVsUpdateSolutionEvents4

IVsUpdateSolutionEvents4.UpdateSolution_BeginUpdateAction提供 dwAction 并在解决方案构建期间开始每个更新操作之前触发 - 在第一个 UpdateProjectCfg_Begin 之前

这正是我所需要的!因为 dwAction 我可以检查 VSSOLNBUILDUPDATEFLAGS

但是 :( 它出现在 VS2012 中,我们的扩展支持 VS2010 及更高版本...因此还需要 2010 版本的变体

UpdateProjectCfg_Begin

IVsUpdateSolutionEvents2.UpdateProjectCfg_Begin还提供了 dwAction(另请参阅 VSSOLNBUILDUPDATEFLAGS)并可用于 2010 版本,但它与第一​​个 BuildEvents 变体相同 - 处理为时已晚(并且不太适合我们的任务)

问题

我找不到这方面的文档,但是 VSSOLNBUILDUPDATEFLAGS 可用于 VS2010,所以我认为应该是将其作为构建操作的当前状态的变体,例如 __VSHPROPID和 IVsHierarchy 等的 GetProperty...

这可能吗?或者我只能订阅 OnBuildBegin o_O


upd1:

__VSHPROPID4

通过\VisualStudioIntegration\Common\Inc\vsshell100.h 找到:

enum __VSHPROPID4
    {   VSHPROPID_TargetFrameworkMoniker    = -2102,
    VSHPROPID_ExternalItem  = -2103,
    VSHPROPID_SupportsAspNetIntegration = -2104,
    VSHPROPID_DesignTimeDependencies    = -2105,
    VSHPROPID_BuildDependencies = -2106,
    VSHPROPID_BuildAction   = -2107,
    VSHPROPID_DescriptiveName   = -2108,
    VSHPROPID_AlwaysBuildOnDebugLaunch  = -2109,
    VSHPROPID_FIRST4    = -2109
    } ;
typedef /* [public] */ DWORD VSHPROPID4;

所以,看医生。 - BSTR __VSHPROPID4.VSHPROPID_BuildAction - 检索项目的构建操作

好的,好消息,下一步......尝试获取,例如:

object type;
hr.GetProperty((uint)VSConstants.VSITEMID.Root, (int)__VSHPROPID4.VSHPROPID_BuildAction, out type);

其中 hr 是 a,例如:

IVsSolutionBuildManager2 sbm = (IVsSolutionBuildManager2)ServiceProvider.GlobalProvider.GetService(typeof(SVsSolutionBuildManager));

IVsHierarchy hr = null;
sbm.get_StartupProject(out hr);

但是,该类型始终为空...通知可能有问题(尚未发生),但如果使用来自 UpdateProjectCfg_Begin/UpdateProjectCfg_Done 的 pHierProj 也会产生类似的结果:

int UpdateProjectCfg_Begin(IVsHierarchy pHierProj, IVsCfg pCfgProj, IVsCfg pCfgSln, uint dwAction, ref int pfCancel)
int UpdateProjectCfg_Done(IVsHierarchy pHierProj, IVsCfg pCfgProj, IVsCfg pCfgSln, uint dwAction, int fSuccess, int fCancel)

它已经提供了 dwAction...

以及,如何使用 VSHPROPID_BuildAction -_- IVsHierarchy 的问题?

最佳答案

完成:)

解决方案1

命令事件

随着EnvDTE.CommandEvents ,我们可以在加工前工作IVsUpdateSolutionEvents2并监听所有传入的命令,示例:

...

GUID: {5EFC7975-14BC-11CF-9B2B-00AA00573819} (ID: 882) :: Build.BuildSolution
GUID: {5EFC7975-14BC-11CF-9B2B-00AA00573819} (ID: 883) :: Build.RebuildSolution
GUID: {5EFC7975-14BC-11CF-9B2B-00AA00573819} (ID: 884) :: Build.DeploySolution
GUID: {5EFC7975-14BC-11CF-9B2B-00AA00573819} (ID: 885) :: Build.CleanSolution
GUID: {1496A755-94DE-11D0-8C3F-00C04FC2AAE2} (ID: 2005) :: Build.PublishSelection
GUID: {1496A755-94DE-11D0-8C3F-00C04FC2AAE2} (ID: 353) :: Build.Link    
...

例如:

_cmdEvents.BeforeExecute += new _dispCommandEvents_BeforeExecuteEventHandler((string guid, int id, object customIn, object customOut, ref bool cancelDefault) => {

        if(GuidList.VSStd97CmdID == guid || GuidList.VSStd2KCmdID == guid) {
            _c.updateContext((BuildType)id);
        }

});

现在我们可以处理 UpdateSolution_Begin 中的操作类型,例如:

if(evt.BuildType != BuildType.Common && evt.BuildType != buildType) {
    //...
}

...

if(buildType == BuildType.Clean || buildType == BuildType.LinkOnly){
   //...
}

等等

您可以在源代码中看到完整示例(请参阅评论所在的位置)。另外,我认为它不是最好的变体,但它是 VS2010 和更高版本的变体(我认为也应该适用于非常老的 2005 和 2008)......

对于 VS2012 和更新版本,我推荐 IVsUpdateSolutionEvents4

所以,我的问题解决了。

其他最佳变体?

关于c# - Visual Studio 生成操作的当前类型 - Microsoft.VisualStudio.Shell.Interop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27018762/

相关文章:

silverlight - 您有什么解决方案可以减少构建时间?

c# - 如果我向 AddControllersWithViews() 添加扩展,它是否也适用于 AddRazorPages()

c++ - 通过将文本文件发送到标准输入来自动测试 Visual Studio 中的 C++ 控制台应用程序?

java - Maven 3原型(prototype):generate Error

visual-studio - Visual Studio 2015 崩溃

c# - 向 RDLC 报告添加新数据集时 Visual Studio 挂起

ios - Expo 应用程序 IPA 在我的 iPhone 上无法运行

c# - 如何在sql server中将参数传递给IN

c# - 构建向导的良好模式?

c# - 这里发生了什么 : Process. GetCurrentProcess().MainModule.ModuleName;?