首页 > 解决方案 > 获取嵌套层次结构返回无效状态代码

问题描述

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

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包含值-2147483648or int.MinValue,这当然是无效的。我想知道我在这里做错了什么。我查看了几个网页:GitHub 1GitHub 2Hot Examples,但它们似乎与我所做的相同。

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


编辑

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

如果层次结构对象不支持请求的接口,则返回 Microsoft.VisualStudio.VSConstants.E_NOINTERFACE。如果请求的接口是必要的(当请求的接口是 IID_IVsUIHierarchy 时通常是这种情况),则调用者会将此节点视为没有子节点。

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


编辑 2

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

标签: c#visual-studiovisual-studio-2019vsix

解决方案


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

在这里设置断点:

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

然后:

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

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

以上有帮助吗?


推荐阅读