Visual Studio 的调试器/交互式窗口如何转储 .NET 中 COM 对象的属性?

2024-03-09

In this 相关问题 https://stackoverflow.com/q/14716871/386205,我注意到 Visual Studio 的调试器能够枚举System.__ComObject http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.getobjectforiunknown.aspx引用,这是“当包装类型不明确时使用的隐藏类型”——例如,当您从另一个 COM 对象获取它并且不自己实例化它时获得的对象类型:

此外,如果您只是将 COM 对象的标识符写入立即窗口,它的属性和值也会类似地转储:

请注意,这与 VS2010 的“动态视图 http://blogs.msdn.com/b/habibh/archive/2009/09/22/debugging-a-com-object-runtime-callable-wrapper-with-visual-studio-2010.aspx“,我相信使用IDispatch http://en.wikipedia.org/wiki/IDispatch和 COM 反射来枚举 COM 对象的属性,而无需使用 PIA 和 .NET 反射。我正在处理的对象not实施IDispatch(他们也不实施IProvideClassInfo http://msdn.microsoft.com/en-us/library/windows/desktop/ms687303%28v=vs.85%29.aspx就此而言),因此,“动态视图”无法获取有关它们的任何信息:

有趣的是,夏普开发 http://www.icsharpcode.net/opensource/sd/的调试器无法列出以下成员System.__Comobjects (e.g. point.Envelope),仅强类型 RCW(例如point).

那么 Visual Studio 是如何做到这一点的呢?

我相信在这种情况下,这是因为主互操作程序集存在这些对象支持的接口的定义,并且 Visual Studio 可能使用反射来枚举支持的接口和属性。准确吗?如果是这样,它是如何运作的?

首先,它如何访问 PIA?它只查看当前加载的 PIA 还是动态加载它们(如果是,如何加载)?它如何确定要枚举哪个接口(可以有多个接口)的属性?它似乎只使用了一个,而不一定是第一个。来自文档 http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#//000100000195000000我正在使用的 API (ArcObjects) 中,这些对象的默认接口是IUnknown http://en.wikipedia.org/wiki/IUnknown,所以它也不只是使用默认接口。

在屏幕截图的示例中,它枚举成员的接口是IEnvelope http://help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/index.html#//002m00000169000000接口,它继承自IGeometry http://help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/index.html#/IGeometry_Interface/002m000001rm000000/界面。 VS2010怎么知道不枚举成员IGeometry相反,在我的测试中,如果您只是枚举 PIA 中的所有接口类型,哪个会首先出现?发生了一些非常聪明的事情,或者也许我错过了一些明显的事情?

我问的原因是开发者LINQPad http://www.linqpad.net/ 看起来愿意 https://stackoverflow.com/q/14716871/386205如果他知道 VS 是如何实现的,他就能实现相同的功能。因此,这里的一个好的答案可能会对改进这个非常流行的工具大有帮助。


操作方法如下:

  • 获取COM对象的IDispatch(替代可能的路径是IDispatchEx)
  • 获取对类型库的引用——IDispatch::GetTypeInfo http://msdn.microsoft.com/en-us/library/windows/desktop/ms221571%28v=vs.85%29.aspx
  • 加载类型库并枚举属性
  • 查询真实对象以获取已发现属性的值

其他增强意见适用:查询IPersist*接口系列或IProvideClassInfo或者获取对象的类型库的引用并发现属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Visual Studio 的调试器/交互式窗口如何转储 .NET 中 COM 对象的属性? 的相关文章

  • .NET WebBrowser 控件可以使用 IE9 吗?

    我意识到这是一个早期版本并且不稳定 我不会梦想在任何其他项目中将默认的 Web 浏览器控件替换为 IE9 但在这种情况下 我特别需要 IE9 与其他版本进行比较 我想让 NET WebBrowser 控件使用 IE9 而不是机器上默认版本的
  • 如何在构建后事件中获取版本号

    我想使用构建后事件自动创建 nuget 包 然后将其复制到我们网络上的共享文件夹 如下所示 版本号 1 0 0 0 在 MyLib nuspec 文件中指定 nuget exe pack SolutionDir MyLib nuspec x
  • 如何正确使用和实例化现有预览处理程序

    我正在尝试使用现有的预览处理程序来显示文件的预览 我编写了一个简单的测试程序 以 1 查找给定文件的预览处理程序的 CLSID 2 实例化预览处理程序 3 通过流或文件初始化它 4 在基本窗口上渲染预览 这有效 或多或少 It works
  • 在工作区中找不到文件

    我使用 Visual Studio 2010 professional 和 TFS 作为源代码控制 一切正常 早上我来打开我的解决方案 它以离线状态打开 我尝试上网 它说 Workspace for this solution could
  • 如何在单元测试中比较列表

    这个测试怎么会失败呢 TestMethod public void Get Code var expected new List
  • 多个 Visual Studio 项目抱怨临时文件丢失,因此无法打开。错误代码 &H80070003

    我在终端服务器上运行 Visual Studio 2010 并且已经运行了一段时间 问题相对较少 今天早上 我启动了我的电脑 在英国的长周末期间 似乎出现了以下问题 我有很多项目 但不是我的所有项目 也不是给定解决方案中的所有项目 抱怨无法
  • 在 VS2010 中发布时 SVsBuildManagerAccessor 失败

    我的 VS 2010 有问题 我无法发布任何项目 我收到错误 获取 SVsBuildManagerAccessor 服务失败 一段时间以来我一直在尝试解决这个问题 奇怪的是 在这种情况开始发生的同时 我也开始遇到 sql server ma
  • C# 代码上的 ImageURL 不显示图像

    我在 aspx 页面上有图像
  • 关闭文件后未保存展开/折叠状态

    在 Visual Studio 中 您可以在不使用区域的情况下展开和折叠代码 例如在代码隐藏页面中您可以折叠方法等 而在 ASPX 页面中您可以折叠标签 标签等 当您的页面很长并且您希望将开发重点放在特定部分时 它非常有用 它的一个很酷的地
  • 如何在 Visual Studio 2010 中处理 TODO 注释?

    我希望 Visual Studio 列出开头包含 TODO 的所有行 通常在注释符号之后 注释符号可能会根据文件类型而变化 这些行可以在解决方案中的任何文本文件中找到 无论是 C VB F T SQL ASPX XAML 或只是 TXT 在
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 无法获取本地或参数的值,因为它在此指令指针处不可用,可能是因为它已被优化掉

    Visual Studio 2010 会删除 没有其他词 不安全块中函数参数之一中的数据 什么可能导致此错误 调试器显示以下消息 Cannot obtain value of local or argument as it is not a
  • 在 .NET 程序集或可执行文件中嵌入文本文件[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 NET 程序集中嵌入文本文件 https stackoverflow com questions 433171 how to embed a text file in a net assemb
  • 警告 C4819:如何查找必须保存在 unicode 中的字符?

    我最近通过 VS2010 看到了以下警告 警告 21 警告 C4819 文件包含当前代码页无法表示的字符 936 以 Unicode 格式保存文件以防止数据丢失 c boost vs2010 boost1 49 include boost
  • 如何查找给定接口 GUID 的 COM 接口定义?

    我有一个 COM 接口 GUID 但我不知道该接口定义 我不知道它有什么方法 有什么参数等等 我怎样才能获得这些信息 一般情况下可以吗 实际问题是获取 中定义的少数 COM 接口的接口定义actxprxy dll 例如IFileDialog
  • System.Windows.Automation 非常慢

    System Windows Automation 非常慢 我执行 element FindAll TreeScope Children Condition TrueCondition 在速度非常快的计算机上 仅获取 30 个子元素可能需要
  • GetCPUDescriptorHandleForHeapStart 堆栈损坏

    我在使用 DirectX 12 0 编程时偶然发现了一个相当不寻常的问题 迄今为止还没有任何研究具有洞察力 我正在使用 C 而不是 C 进行编程 官方 DirectX 12 标头似乎支持 C 和 C 的绑定 但是编写 C 等效代码来执行上述
  • Visual Studio 2010 - 在调试期间查看列表导致超时

    我正在尝试调试一个项目 突然遇到一个问题 如果我尝试查看它 枚举任何对象集合都会导致超时 如果我正常运行该程序 就没有问题 如果我尝试查看任何集合 例如列表 我会收到超时错误 整个事情就会崩溃 我认为我的一个更复杂的集合可能出了问题 所以我
  • 以编程方式确定是否安装了 COM 库 (.DLL)

    C 中是否有一种编程方式来确定是否已安装特定的 COM DLL 或者这是扫描注册表中的 classId 的问题 我通常所做的 如果我再次需要的话也会这样做 是尝试创建一个您知道位于 COM 库中的类的对象实例 通过 ProgID 或 GUI
  • CLR 无法在 UWP 中创建基于 .NET 的 COM 对象

    我创建了一个类库 NET Framework 4 7 1 它实现了文本服务 ITfTextInputProcessorEx等 中TSF https msdn microsoft com en us library windows deskt

随机推荐