通过本机指针查看托管COM对象

马克·唐尼

如果你是一个成功策划的开发人员。NET项目使用COM互操作,那么我们最新的Visual Studio预览就是为您准备的(下载16.7预览版3). 此功能自动解码本机指针引用的托管COM对象,允许您在“Locals Window”中完全检查值。

我非常幸运,自90年代以来一直在使用Microsoft堆栈#在那段时间里,技术上出现了一些真正的变革性飞跃,帮助像我这样的开发人员为多个行业的客户提供解决方案。

几年前,我帮助设计和支持了一个非常成功的网上银行平台,然而,核心设计是在90年代末和21世纪初开发的,这意味着对COM的依赖性很大。

COM是什么?

组件对象模型是一个分布式的、面向对象的标准,用于创建可以交互的二进制软件组件,它成功了DDE公司(现在又回来了😊) 并成为微软的基础技术对象链接和嵌入ActiveX控件技术。

COM允许对象位于单个进程或其他进程中,也可以在远程服务器上实例化(使用DCOM–分布式COM)。我们将COM称为二进制标准,因为对象可以用不同的语言编写。COM还定义了对象如何在分布式环境中协同工作,并具有管理系统和组件完整性的安全功能。

在Visual Studio中调试异构系统

什么时候。NET是在21世纪初引入的,它旨在取代COM,然而,我的老开发团队已经为一长串满意的客户创建了一组引人注目的服务。

感谢我们COM和。NET是互补的开发技术。这个。NET公共语言运行库提供了与COM的双向集成。这意味着COM和。NET应用程序和组件可以利用彼此的功能。这保护了我们在COM中的现有投资,同时允许我们利用。NET以一种深思熟虑且具有成本效益的节奏。

即使在技术堆栈之间进行了这种合作,VisualStudio中的一些调试经验仍然不足,尤其是在全变量检查方面。如果您有一个使用托管代码中实现的COM对象的本机代码基,则尤其如此。

当COM客户端调用时。NET对象,公共语言运行库创建托管对象和COM可调用包装(CCW)对象的。无法引用。NET对象,COM客户端使用CCW作为托管对象的代理。

Visual Studio中最初的调试经验显示托管实现对象的COM接口指针作为函数表没有可识别的值(vtable,虚拟方法表,是COM在运行时将方法调用绑定到其实现的方式)。下图显示了我在当地人窗口。

带有显示vtable的“局部变量”窗口的Visual Studio

现在,在最新的预览中,VisualStudio会自动转换本机指针引用的托管COM对象,从而允许您查看变量名称、值和类型。

Visual Studio with Locals窗口显示自动转换的托管COM对象

在以下情况下,也可以解码本机指针引用的托管COM对象调试内存转储在Visual Studio中。这种体验类似于WinDbg公司使用时!DumpCCW命令(如下所示频道9上的碎片整理工具视频).

若要利用此功能,您的应用程序必须作为单个应用程序运行应用程序域和使用混合模式调试(本机与.NET Framework 4.X和/或.NET Core 3.X一起提供)。

告诉我们你的想法!

下载Visual Studio 16.7预览版3开始测试这个!请在Visual Studio中通过“报告问题”或直接在开发者社区网站。我们有兴趣听取您的反馈!

3条评论

讨论结束。登录以编辑/删除现有评论。

  • 安德鲁·曼塞尔 0

    看起来很棒!反过来,这是否可以用于检查托管代码中的本机COM对象?

    • 马克·唐尼Microsoft员工 0

      问得好,安德鲁!这已经存在。如果托管对象具有由本机实现支持的COM接口引用(并且您正在进行混合模式调试),则监视/本地窗口中的接口扩展将显示“本机视图”节点,该节点可以展开以检查本机对象。

      如果您有任何问题,请通过“报告问题”或直接在开发者社区网站.

  • 什穆利·恩格拉德 0

    这也适用于WinRT(COM的一种)吗?

反馈usabilla图标