基本上,我正在尝试获取项目中文件夹的嵌套层次结构。在下面,您可以看到我的代码的简化版本,在这里我是层次结构的第一个节点,即文件夹。
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
都包含值-2147483648
或int.MinValue
,这当然是无效的。我想知道我在做什么错。我看了几个网页:GitHub 1,GitHub 2和Hot Examples,但它们似乎与我正在做的相同。
注意CurrentHierarchy
代表项目层次结构,IsFolder
的值实际上是正确的,例如该节点实际上是一个文件夹。
[深入研究之后,我发现GetNestedHierarchy
实际上返回了VSConstants.E_FAIL
,这意味着:
如果层次结构对象不支持所请求的接口,则返回Microsoft.VisualStudio.VSConstants.E_NOINTERFACE。然后,如果请求的接口是必不可少的,则调用者将将此节点视为没有子节点(通常,当请求的接口为IID_IVsUIHierarchy时就是这种情况)。
甚至让我感到困惑,因为我传递给该方法的节点确实是一个文件夹。
我想我在这些要点中为您提供了答案:
在此处设置断点:
var result = CurrentHierarchy.GetNestedHierarchy((uint)(int)tempNode, ref guid, out var hierarchyObjectPointer, out var nested); // Returns invalid status code
然后:
检查CurrentHierarchy对象,以确保其FirstChild属性值不为null。如果为null,则返回值为VSConstants.E_FAIL
。
检查具有ID值等于您传入的uint tempNode值的节点的整个层次结构。如果没有节点ID与tempNode值匹配,则返回返回值VSConstants.E_FAIL
。
以上帮助吗?