c# - 启用 native 代码调试以深入 COM 对象

标签 c# visual-studio-2015 com arcobjects

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

IGeometry geometry = GetGeometry();

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

enter image description here

我读过几个问题,它们都指向 Visual Studio 2015 中的“启用 native 代码调试”选项。我已经启用该选项但无济于事。

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

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

enter image description here

最佳答案

如果您还拥有组件的 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/

相关文章:

c# - 从 couchbase View 获取计数器文档

vb.net - 升级到 Office 2016 引用错误 : Microsoft. Office.Interop.Excel

Visual Studio Enterprise 2015 中的 C# 7.0

visual-c++ - 视觉 C++ : ATL Implementation of an Interface

c# - 将反射与 COM Interop 结合使用

c# - 我绝对需要在每个 MSHTML 对象上调用 ReleaseComObject 吗?

c# - 创建具有富文本和动态行控件的 ASP 应用程序

c# - 检测向量 2 是否位于另外两个向量 2 之间

c# - 使用SwitchParameter的PowerShell自定义Cmdlet

cordova - Visual Studio 2015/ Cordova "Unable to start Debugging"