【问题标题】:VS2017 debugging: Unable to access members of COM objectVS2017调试:无法访问COM对象的成员
【发布时间】:2019-02-02 01:23:35
【问题描述】:

问题

通常,Visual Studio 的“动态视图”会显示对象的成员。有时,该对象需要所有线程都运行,您必须手动允许它才能看到成员。但是,对于这个 COM 对象,当我尝试查看成员时出现错误:

无法计算表达式。不支持操作。未知错误:0x80070057。


详情

以下是过程截图:

  1. 查看 COM 对象:

  2. 查看 COM 对象的成员:

  3. 打开动态视图会导致:

    函数求值需要所有线程运行。

  4. 当我点击刷新图标时,错误发生了变化:

    无法计算表达式。不支持操作。未知错误: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 });
      

      【讨论】:

        猜你喜欢
        • 2016-05-12
        • 2018-06-04
        • 1970-01-01
        • 2012-10-14
        • 1970-01-01
        • 2015-04-06
        • 1970-01-01
        • 2011-04-07
        • 2018-09-21
        相关资源
        最近更新 更多