首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VisualStudio-Microsoft.VisualStudio.Shell.Interop生成操作的当前类型

VisualStudio-Microsoft.VisualStudio.Shell.Interop生成操作的当前类型
EN

Stack Overflow用户
提问于 2014-11-19 14:00:11
回答 1查看 6.7K关注 0票数 3

在某些扩展中,我们实现了用于向IVsUpdateSolutionEvents2注册调用者的IVsSolutionBuildManager2AdviseUpdateSolutionEvents

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

代码语言:javascript
复制
public int UpdateSolution_Begin(ref int pfCancelUpdate)
{
    ...
}

但是,还需要获取当前生成操作的状态或类型,例如:构建/重建/清理/部署

现有和已知的变体:

BuildEvents

使用Events.BuildEvents,我可以订阅OnBuildBegin,例如:

代码语言:javascript
复制
_buildEvents.OnBuildBegin += new _dispBuildEvents_OnBuildBeginEventHandler((vsBuildScope Scope, vsBuildAction Action) => {
    buildType = (BuildType)Action;
});

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

但是开始 / StartUpdate使用通知方法将第一个称为优先级,因此buildType设置得太晚了。

此外,我们也可以使用这个OnBuildBegin而不是UpdateProjectCfg_Begin / UpdateSolution_StartUpdate,但是我们的处理也需要与优先级调用者

IVsUpdateSolutionEvents4

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

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

但是:(它出现在VS2012中,我们的扩展支持VS2010和更高的.所以也需要2010年版本的变体

UpdateProjectCfg_Begin

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

问题

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

有可能吗?或者我只能使用OnBuildBegin订阅o_O。

upd1:

__VSHPROPID4

与\VisualStudioIntegration\Common\Inc\vsshell100.h:一起发现

代码语言:javascript
复制
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 BuildAction -检索项的生成操作

好吧,好消息,下一步.例如,试着得到:

代码语言:javascript
复制
object type;
hr.GetProperty((uint)VSConstants.VSITEMID.Root, (int)__VSHPROPID4.VSHPROPID_BuildAction, out type);

例如,人力资源是a:

代码语言:javascript
复制
IVsSolutionBuildManager2 sbm = (IVsSolutionBuildManager2)ServiceProvider.GlobalProvider.GetService(typeof(SVsSolutionBuildManager));

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

但是,类型总是为空.通知可能会出现问题(尚未发生),但如果使用来自UpdateProjectCfg_Begin /UpdateProjectCfg_Done的UpdateProjectCfg_Begin/UpdateProjectCfg_Done,也会出现类似的结果:

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-22 19:00:01

完成:)

解决方案1

CommandEvents

使用EnvDTE.CommandEvents,我们可以在处理IVsUpdateSolutionEvents2之前工作,并侦听所有传入命令,示例:

  • VSStd97CmdID -{5EFC7975-14BC-11 CF-9B2B-00AA00573819} http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.vsconstants.vsstd97cmdid.aspx
  • VSStd2KCmdID - {1496A755-94DE-11D0-8C3F-00C04FC2AAE2} http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.vsconstants.vsstd2kcmdid.aspx

..。

代码语言:javascript
复制
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    
...

例如:

代码语言:javascript
复制
_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);
        }

});

现在我们可以使用开始中的操作类型,例如:

代码语言:javascript
复制
if(evt.BuildType != BuildType.Common && evt.BuildType != buildType) {
    //...
}

..。

代码语言:javascript
复制
if(buildType == BuildType.Clean || buildType == BuildType.LinkOnly){
   //...
}

等。

您可以在源代码中看到完整的示例(请参见注释所在)。而且,我认为它不是最好的变体,但是它是VS2010和更高版本的变体(我认为它也适用于非常老的2005 &2008年)…

对于VS2012和更新版本,我建议使用IVsUpdateSolutionEvents4

所以我的问题解决了。

其他最好的变体?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27018762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档