代码之家  ›  专栏  ›  技术社区  ›  MakePeaceGreatAgain

允许本机代码调试深入到COM对象

  •  11
  • MakePeaceGreatAgain  · 技术社区  · 8 年前

    我有一些代码使用了COM公开的第三方lib(arcObjects)。例如, IGeometry -接口。

    IGeometry geometry = GetGeometry();
    

    现在,当我想查看对象成员时,我打开一个QuickWatch:

    enter image description here

    我读过几个问题,都指向Visual Studio 2015中的“启用本机代码调试”选项。我已经使那个选项无效了。

    如何让调试器公开COM对象的成员?

    编辑:当使用VS2010和.NET 3.5时,此操作有效:

    enter image description here

    2 回复  |  直到 7 年前
        1
  •  7
  •   Hans Passant    7 年前

    启用非托管调试只能有一个有用的副作用,如果您还具有该组件的PDB和源代码。你不知道,这类组件的供应商不会透露。你能看到任何东西的唯一原因是你让vs生成 互操作程序集 对于COM组件。它将组件的类型库中的声明转换为等效的.NET类型。像IGeometry一样,很可能实际上是引擎盖下的C++类。

    这是顶部视图和底部屏幕截图之间的巨大差异。从VS2010和.NET 4.0开始,不再需要此互操作程序集。称为“类型嵌入”,通常是一个非常有用的特性,它避免了为组件部署PIA的需要。尤其是对于Office Interop来说,这是一个非常大的问题。

    类型嵌入积极地删除了源代码中未使用的类型和成员。剩下的部分嵌入到最终的程序集中,因此不再需要部署互操作程序集或PIA。或者换句话说,您在调试器中看不到igometry.envelope,因为源代码不使用该属性。它被嵌入管道的类型剥离。

    这很容易解决。在项目的引用节点中选择COM引用,并将其“嵌入互操作类型”属性设置为false。您可以在测试后保持这种方式,不要忘记然后还要部署互操作程序集。

        2
  •  1
  •   HimBromBeere    7 年前

    正如我在评论中提到的那样 gis.stackexchange.com 另外,我引用了我们的解决方案:

    在Visual Studio中的“工具”-->选项”->调试下启用该选项 “使用托管兼容模式”。

    推荐文章