【发布时间】:2014-11-19 14:00:11
【问题描述】:
在某些扩展中,我们实现了IVsUpdateSolutionEvents2 和IVsSolutionBuildManager2 用于向AdviseUpdateSolutionEvents 注册调用者
例如,在任何构建操作开始之前调用:
public int UpdateSolution_Begin(ref int pfCancelUpdate)
{
...
}
但是,还需要获取当前构建操作的状态或类型,例如: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
更新1:
__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 的问题?
【问题讨论】:
-
只是检查:当人们尝试挂钩 Visual Studio 构建信息的一半时间,他们真正想要做的是直接挂钩 MSBuild 以扩展他们的构建系统.您要达到的最终目标是什么?
-
@JasonMalinowski 见here - 为下一个版本计划了构建操作的上下文
标签: c# visual-studio build visual-studio-extensions envdte