启用本机代码调试以深入 COM-object

Enable native code debugging to deep into COM-object

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

IGeometry geometry = GetGeometry();

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

我读过几个问题,它们都指向 Visual Studio 2015 中的 "enable native code debugging" 选项。我已经启用了该选项但无济于事。

如何让调试器公开 COM-object 的成员?

编辑:在使用 VS2010 和 .NET 3.5 时有效:

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

这是顶部视图和底部屏幕截图之间的最大区别。从 VS2010 和 .NET 4.0 开始,不再需要此互操作程序集。称为 "type embedding",通常是一个非常有用的功能,它避免了为组件部署 PIA 的需要。特别是对于 Office 互操作来说,这是一件非常重要的事情。

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

这很容易修复。 Select 项目引用节点中的 COM 引用并将其 "Embed Interop Types" 属性 设置为 False。您可以在测试后保持原样,不要忘记部署互操作程序集。

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

In Visual Studio under Tools-->Options-->Debugging enable the option "Use Managed Compatibility Mode".