我有一些代码使用由 COM 公开的第 3 方库 (ArcObjects)。例如,IGeometry
接口(interface)。
IGeometry geometry = GetGeometry();
现在,当我想查看对象成员时,我打开一个 QuickWatch:
我读过几个问题,它们都指向 Visual Studio 2015 中的“启用 native 代码调试”选项。我已经启用该选项但无济于事。
如何让调试器公开 COM 对象的成员?
编辑:当使用 VS2010 和 .NET 3.5 时,这有效:
最佳答案
如果您还拥有组件的 PDB 和源代码,则启用非托管调试只会产生有用的副作用。你不知道,这些组件的供应商不会透露它。您可以看到任何东西的唯一原因是因为您让 VS 为 COM 组件生成 interop 程序集。它将组件类型库中的声明转换为等效的 .NET 类型。与 IGeometry 一样,很可能实际上是一个 C++ 类。
这是顶部 View 和底部屏幕截图之间的最大区别。从 VS2010 和 .NET 4.0 开始,不再需要此互操作程序集。称为“类型嵌入”,通常是一个非常有用的功能,它避免了为组件部署 PIA 的需要。特别是对于 Office 互操作而言,这是一件非常重要的事情。
类型嵌入积极删除了源代码中未使用的类型和成员。剩下的嵌入到您的最终程序集中,因此无需部署互操作程序集或 PIA。或者换句话说,您在调试器中看不到 IGeometry.Envelope,因为您的源代码不使用该属性。它被类型嵌入管道剥离了。
这很容易修复。在项目的引用节点中选择 COM 引用,并将其“嵌入互操作类型”属性设置为 False。您可以在测试后保持原样,不要忘记部署互操作程序集。
关于c# - 启用 native 代码调试以深入 COM 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50467025/