如何判断调试器使用的索引类型
How to tell type of indexing used from debugger
下面显示了一个在断点处停止的 C# 控制台应用程序。 sln
变量的类型是 Solution2。通过研究,我确定解决方案中的 Projects
项目使用基于 1 的索引,因此这就是我检索 Visual Studio 解决方案中唯一项目(断点所在的行)的方式:
project = sln.Projects.Item(1);
我试图通过调试器做的是试图弄清楚我是否可以判断集合是基于 0 还是基于 1,如果我事先没有这些信息.但是调试器只显示 Projects
集合的 Count
为 1。有没有办法(不进行实验)通过调试器查看集合来获得这些知识?
另外,相关问题:
Dynamic View
元素是什么?
扩展 `[System.__ComObject] 导致如下看似递归的显示:
这是为什么?它有什么作用?
要回答您的第一个问题,没有简单的方法可以判断基于 COM 的集合是基于 0 还是基于 1。不会,除非您愿意反汇编实现 COM 接口的对象的 get_Item() 方法的实现。它可以是 0 或 1,一般来说,甚至不能保证索引应该是整数值。其实你的Projects.Item method的定义是把System.Object作为参数的:
Project Item(
Object index
)
---
Parameters
indexType: System.Object
Required. The index of the item to return.
在你的情况下,你可以避免使用 Item 方法,因为 Projects
集合是 IEnumerable
,所以你可以只获取枚举的第一个元素:
#using System.Linq;
---
var firstItem = sln.Projects.First();
你的最后一个问题只是 Visual Studio 调试器的一个错误(或 "feature")。 VS 调试器中的 COM 互操作不是最好的领域。如果您发现需要在较低级别调试 COM 互操作,最好使用低级别调试器,如 WinDbg 并手动遍历接口 vtable。
下面显示了一个在断点处停止的 C# 控制台应用程序。 sln
变量的类型是 Solution2。通过研究,我确定解决方案中的 Projects
项目使用基于 1 的索引,因此这就是我检索 Visual Studio 解决方案中唯一项目(断点所在的行)的方式:
project = sln.Projects.Item(1);
我试图通过调试器做的是试图弄清楚我是否可以判断集合是基于 0 还是基于 1,如果我事先没有这些信息.但是调试器只显示 Projects
集合的 Count
为 1。有没有办法(不进行实验)通过调试器查看集合来获得这些知识?
另外,相关问题:
Dynamic View
元素是什么?
扩展 `[System.__ComObject] 导致如下看似递归的显示:
这是为什么?它有什么作用?
要回答您的第一个问题,没有简单的方法可以判断基于 COM 的集合是基于 0 还是基于 1。不会,除非您愿意反汇编实现 COM 接口的对象的 get_Item() 方法的实现。它可以是 0 或 1,一般来说,甚至不能保证索引应该是整数值。其实你的Projects.Item method的定义是把System.Object作为参数的:
Project Item(
Object index
)
---
Parameters
indexType: System.Object
Required. The index of the item to return.
在你的情况下,你可以避免使用 Item 方法,因为 Projects
集合是 IEnumerable
,所以你可以只获取枚举的第一个元素:
#using System.Linq;
---
var firstItem = sln.Projects.First();
你的最后一个问题只是 Visual Studio 调试器的一个错误(或 "feature")。 VS 调试器中的 COM 互操作不是最好的领域。如果您发现需要在较低级别调试 COM 互操作,最好使用低级别调试器,如 WinDbg 并手动遍历接口 vtable。