获取嵌套层次结构将返回无效的状态代码



>基本上,我正在尝试获取项目中文件夹的嵌套层次结构。在下面,您可以看到我的代码的简化版本,其中我采用了层次结构的第一个节点,这是一个文件夹。

CurrentHierarchy.GetProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_FirstVisibleChild, out var tempNode);
if (IsFolder)
{
var guid = typeof(IVsHierarchy).GUID;
var result = CurrentHierarchy.GetNestedHierarchy((uint)(int)tempNode, ref guid, out var hierarchyObjectPointer, out var nested); // Returns invalid status code
var hierarchy = (IVsHierarchy)Marshal.GetObjectForIUnknown(hierarchyObjectPointer);
Marshal.Release(hierarchyObjectPointer);
}

无论如何,变量result包含值-2147483648int.MinValue,这当然是无效的。我想知道我在这里做错了什么。我看了几个网页:GitHub 1、GitHub 2 和热门示例,但它们似乎和我正在做的事情是一样的。

请注意,CurrentHierarchy表示项目层次结构,IsFolder的值实际上是正确的,例如节点实际上是一个文件夹。


编辑

在周围挖掘了更多内容后,我注意到GetNestedHierarchy实际上正在返回VSConstants.E_FAIL这意味着:

如果请求的接口在层次结构对象上不受支持,则返回 Microsoft.VisualStudio.VSConstants.E_NOINTERFACE。然后,如果请求的接口是必不可少的(当请求的接口是IID_IVsUIHierarchy时,调用方会将此节点视为没有子节点。

这甚至让我更加困惑,因为我传递给该方法的节点确实是一个文件夹。


编辑 2

如果IVsHierarchy表示IVsSolution,似乎代码工作正常,但是一旦我尝试获取嵌套层次结构的嵌套层次结构,它就不再起作用了。

我想我在以下几点中有一个答案:

在此处设置断点:

var result = CurrentHierarchy.GetNestedHierarchy((uint)(int)tempNode, ref guid, out var hierarchyObjectPointer, out var nested); // Returns invalid status code

然后:

  1. 检查 CurrentHierarchy 对象,确保它具有不为 null 的 FirstChild 属性值。如果为 null,您将获得VSConstants.E_FAIL的返回值。

  2. 检查整个层次结构中是否存在 ID 值等于传入的 uint tempNode 值的节点。如果没有节点 ID 与 tempNode 值匹配,则返回值VSConstants.E_FAIL

以上有帮助吗?

这整件事实际上比最初预期的要容易得多。我实际上怀念理解GetNestedHierarchy的使用和整个原则。因此,让我为其他人解释一下。

乍一看,您可能会认为文件夹和任何可扩展的节点都是层次结构,但事实并非如此!

即使如此,什么是层次结构?实际上,从我的测试来看,层次结构只是一个解决方案和一个项目没有别的。因此,如果您想在项目文件夹中获取项目,则需要通过一遍又一遍地调用GetProperty来获取每个孩子。

hierarchy.GetProperty(folderItemId, (int)__VSHPROPID.VSHPROPID_FirstChild, out var folderItem);
hierarchy.GetProperty(folderItem, (int)__VSHPROPID.VSHPROPID_FirstChild, out var folderItemItem);

基本上,项目IVsHierarchy托管项目中的所有项。

相关内容

最新更新