Visual Studio 中生成操作的当前类型 - Microsoft.VisualStudio.Shell.Inte
本文关键字:类型 Microsoft VisualStudio Inte Shell Studio 操作 Visual | 更新日期: 2023-09-27 18:31:13
在某些扩展中,我们实现了IVsUpdateSolutionEvents2和 IVsSolutionBuildManager2,用于向 AdviceUpdateSolutionEvents 注册调用方
例如,在任何生成操作开始之前调用:
public int UpdateSolution_Begin(ref int pfCancelUpdate)
{
...
}
但是,还需要获取当前构建操作的状态或类型,例如:构建/重建/清理/部署
可用和已知变体:
构建事件
使用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,但是也需要尽快与优先级调用者进行处理
IVs更新解决方案事件4
该IVsUpdateSolutionEvents4.UpdateSolution_BeginUpdateAction提供 dwAction,并在解决方案生成期间的每个更新操作开始之前触发 - 在第一个UpdateProjectCfg_Begin之前
这正是我所需要的! 因为 dwAction 我可以检查 VSSOLNBUILDUPDATEFLAGS
然而:(它出现在VS2012中,我们的扩展支持VS2010及更高版本...所以还需要 2010 版本的变体
UpdateProjectCfg_Begin
该IVsUpdateSolutionEvents2.UpdateProjectCfg_Begin还提供了 dwAction(另请参阅 VSSOLNBUILDUPDATEFLAGS)并可用于 2010 版本,但它与第一个 BuildEvents 变体相同 - 处理为时已晚(不太适合我们的任务)
问题
我找不到这方面的文档,但是VSSOLNBUILD更新标志可用于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...
以及如何使用 IVsHierarchy 的 VSHPROPID_BuildAction -_- 问题?
完成了:)
解决方案 1
命令事件
使用 EnvDTE.CommandEvents,我们可以在处理 IVsUpdateSolutionEvents2 之前工作并侦听所有传入的命令,示例:
-
VSStd97CmdID - {5EFC7975-14BC-11CF-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
。
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
所以,我的问题解决了。
其他最佳变体 ?