【发布时间】:2016-08-24 14:25:22
【问题描述】:
我一直在关注MSDN's Hello World guide to developing Visual Studio extensions(本文专门讨论如何将其创建为 Visual Studio 工具栏命令)。
我正在尝试列出当前/活动解决方案中包含的所有项目。
在命令模板的自动生成代码中。
我尝试过EnvDTE 的Solution 的Projects 属性,但它显示的项目为零。
还有一个ActiveSolutionProjects 属性,但它也显示一个空数组。
这是如何实现的?
P.S.:我尝试了 DTE 和 DTE2 接口,因为从文档中理解要使用哪个版本令人困惑。我得到了 DTE2 的空服务,所以我选择 DTE。
我的解决方案资源管理器如下所示:
更新:来自 gitter/extendvs 的 Bert Huijben 提出了以下建议,可在 VSSDK Extensibility Samples 找到 - 但这也不起作用(在构造函数和回调函数中返回 0 个元素功能):
private Hashtable GetLoadedControllableProjectsEnum()
{
Hashtable mapHierarchies = new Hashtable();
IVsSolution sol = (IVsSolution)this.ServiceProvider.GetService(typeof(SVsSolution));
Guid rguidEnumOnlyThisType = new Guid();
IEnumHierarchies ppenum = null;
ErrorHandler.ThrowOnFailure(sol.GetProjectEnum((uint)__VSENUMPROJFLAGS.EPF_LOADEDINSOLUTION, ref rguidEnumOnlyThisType, out ppenum));
IVsHierarchy[] rgelt = new IVsHierarchy[1];
uint pceltFetched = 0;
while (ppenum.Next(1, rgelt, out pceltFetched) == VSConstants.S_OK &&
pceltFetched == 1)
{
IVsSccProject2 sccProject2 = rgelt[0] as IVsSccProject2;
if (sccProject2 != null)
{
mapHierarchies[rgelt[0]] = true;
}
}
return mapHierarchies;
}
【问题讨论】:
-
快速浏览一下代码,应该可以工作。 this.ServiceProvider 得到了什么?如果您改为使用 GetService(typeof(SDTE)),但保持演员表不变,会有什么变化吗?
-
在 Command1 构造函数中,可能尚未加载解决方案。尝试将您的代码移动到 MenuItemCallback。
-
@JasonMalinowski:它得到一个
System.__ComObject,其中包含一个Solution属性,而该属性又包含一个Projects属性。我按照你的建议尝试了 SDTE,但是 SDTE 是一个空接口,所以没有多大帮助。 -
@SergeyVlasov:也尝试将代码移到那里,同样的事情。
-
@Veverke:我的意思是您在 GetService 参数中使用了 SDTE,但您仍然将其转换为常规接口。没有规定两者必须相同。
标签: c# visual-studio-extensions vsix envdte