启用本机代码调试以深入到COM对象中

我有一些代码使用COM公开的第三方库(ArcObjects)。 例如,有IGeometry IGeometry

 IGeometry geometry = GetGeometry(); 

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

在此处输入图像描述

我已经阅读了几个问题,这些问题都指向Visual Studio 2015中的“启用本机代码调试”选项。我已经启用该选项无济于事。

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

编辑:当使用VS2010和.NET 3.5时,这适用:

在此处输入图像描述

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

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

键入嵌入主动删除的类型和源代码中未使用的成员。 剩下的内容嵌入到最终组件中,从而无需部署互操作组件或PIA。 或者换句话说,您无法在调试器中看到IGeometry.Envelope,因为您的源代码不使用该属性。 它被类型嵌入管道剥离。

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

正如评论中所建议的那样,我也在gis.stackexchange.com上发布了这个问题,我引用了我们的解决方案:

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

Interesting Posts