【问题标题】:VS2017 debugging: Unable to access members of COM objectVS2017调试:无法访问COM对象的成员
【发布时间】:2019-02-02 01:23:35
【问题描述】:
问题
通常,Visual Studio 的“动态视图”会显示对象的成员。有时,该对象需要所有线程都运行,您必须手动允许它才能看到成员。但是,对于这个 COM 对象,当我尝试查看成员时出现错误:
无法计算表达式。不支持操作。未知错误:0x80070057。
详情
以下是过程截图:
-
查看 COM 对象:
-
查看 COM 对象的成员:
-
打开动态视图会导致:
函数求值需要所有线程运行。
-
当我点击刷新图标时,错误发生了变化:
无法计算表达式。不支持操作。未知错误:0x80070057。
我尝试过的
除了对这两条错误消息的不确定研究之外,我尝试过的唯一方法是删除 .suo 文件并重新启动 Visual Studio。
我知道 API 调用返回什么数据,因为我能够将数据打印到控制台。但是,无法从调试器中查看这些数据确实让我慢了下来。任何帮助,将不胜感激。谢谢!
【问题讨论】:
标签:
c#
.net
debugging
com
visual-studio-2017
【解决方案1】:
在我的例子中,通过启用“使用托管兼容模式”选项,我能够在调试器中看到 com 对象类型
在 Visual Studio 中,如果您打开工具 >> 选项然后调试 >> 常规,请确保选中“使用托管兼容模式”选项。
这应该在调试器中将 com 对象显示为它们的正确类型。
【解决方案2】:
Hans Passant 在this question 中的以下评论帮助我找到了解决方案:
您通常可以将其转换为受支持的接口类型之一
零件。然后调试器再次变得聪明......用它迭代它
前锋。实际的底层运行时类型是代理,当您
从工作线程调用该方法,或者如果它是进程外的
服务器。
解决方案是在尝试使用 COM 对象之前先对其进行迭代。因此,如果 COM 对象是一个集合,则迭代项目,转换为接口类型,并将结果存储在 var 或自定义模型中。
类似这样的:
var myObject = com.GetStuff().OfType<InterfaceClass>().Select(s => new { Name = s.Name, Description = s.Description });