c# - 获取嵌套层次结构返回无效状态代码
问题描述
基本上我正在尝试获取项目中文件夹的嵌套层次结构。在下方,您可以看到我的代码的简化版本,其中我采用了层次结构的第一个节点,它是一个文件夹。
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
or int.MinValue
,这当然是无效的。我想知道我在这里做错了什么。我查看了几个网页:GitHub 1、GitHub 2和Hot Examples,但它们似乎与我所做的相同。
请注意,CurrentHierarchy
代表项目层次结构,而IsFolder
' 值实际上是正确的,例如节点实际上是一个文件夹。
编辑
在挖掘了更多之后,我注意到它GetNestedHierarchy
实际上正在返回VSConstants.E_FAIL
,这意味着:
如果层次结构对象不支持请求的接口,则返回 Microsoft.VisualStudio.VSConstants.E_NOINTERFACE。如果请求的接口是必要的(当请求的接口是 IID_IVsUIHierarchy 时通常是这种情况),则调用者会将此节点视为没有子节点。
这甚至让我更加困惑,因为我传递给该方法的节点确实是一个文件夹。
编辑 2
看起来代码工作正常,如果IVsHierarchy
代表 an IVsSolution
,但是一旦我尝试获取嵌套层次结构的嵌套层次结构,它就不再工作了。
解决方案
我想我在以下几点中有一个答案:
在这里设置断点:
var result = CurrentHierarchy.GetNestedHierarchy((uint)(int)tempNode, ref guid, out var hierarchyObjectPointer, out var nested); // Returns invalid status code
然后:
检查 CurrentHierarchy 对象以确保它具有不为空的 FirstChild 属性值。如果它为空,您将获得一个返回值
VSConstants.E_FAIL
。检查整个层次结构中是否有 ID 值等于您传入的 uint tempNode 值的节点。如果没有节点 ID 与 tempNode 值匹配,则返回
VSConstants.E_FAIL
.
以上有帮助吗?
推荐阅读
- swift - 使用 Snapkit 查看动画
- javascript - 延迟的对 JavaScript 对象的重复迭代
- java - 如何在 java 中使用 Hibernate 为 CRUD 操作创建泛型方法
- java - 从 testNG.xml 文件中检索参数值
- r - R:用新数据预测 VAR
- android - 图片在recycleview点击监听器中捕捉焦点
- c# - Xmlserializer 到 C# 对象,存储原始 XML 元素
- laravel - Laravel 雄辩删除
- amazon-web-services - 设置向导菜单时无法连接詹金斯
- python - Tensorflow分配内存:分配38535168超过系统内存的10%