【问题标题】:Inspecting an instance of a COM / Interop class properly in VS.Net's debugger?在 VS.Net 的调试器中正确检查 COM / Interop 类的实例?
【发布时间】:2010-11-21 07:59:04
【问题描述】:

有谁知道在 VisualStudio 的调试器中是否以及如何正确地查看 COM / Interop 对象(以其正确的类型)?我得到的只是'evil' System.__ComObject 值(即使它正确识别了类型)?

例如:

【问题讨论】:

  • /me 耐心等待一个好的答案。 :)

标签: .net com interop com-interop


【解决方案1】:

来自.NET and COM: The Complete Interoperability Guide

当一个 COM 对象的实例通过方法的返回类型或引用参数返回给您,而 CLR 无法确定类型时,您将获得泛型 System.__ComObject 类型,因为 COM 对象总是作为接口指针传递/返回。

您可以尝试使用Marshal.CreateWrapperOfType 更改返回类型,如下例所示:

MyType newObject = (MyType)Marshal.CreateWrapperOfType(oldObject, typeof(MyType))

然后您可以在监视窗口中查看 newObject,它应该具有预期的属性。

如果调用失败,则会抛出 InvalidCastException。

【讨论】:

    【解决方案2】:

    所以,这不是答案,但请查看这两个屏幕截图。这是来自同一个应用程序,只是在两个不同的断点处。在这两种情况下,COM 对象都来自同一个 COM/AX 库。我不知道为什么在一种情况下我看到“System.__ComObject”而在另一种情况下看到正确的类型。但是,在这两种情况下,我都看到了适当的对象/接口属性。是什么赋予了?为什么会有差异?

    这里的第一个显示它显示了“System.__ComObject”,但它也显示了该对象的所有属性。点击查看大图。

    第二个完全隐藏了“System.__ComObject”。点击查看大图。

    【讨论】:

    • 嘿,也许这取决于变量的初始化/创建方式?第一个是怎么活过来的? -J
    • 我也想过这个问题。我想知道如果你实例化它而不是简单地从 COM 对象返回一个对象实例,你是否会在本地/监视窗口中获得更多信息。在第一张图片中,“unsplitShape”是从 COM 对象返回的。在第二张图片中,“scratchLayer”是我实例化的一个对象。你在运行 VS2003/2005/2008 吗?服务包级别?
    • 我正在运行 VS2008 SP1 是的,它似乎与获取对象的不同方式有关:实例化与从例如“获取”它工厂方法等。嗯。但还是。感谢您的提示!
    【解决方案3】:

    我使用即时窗口手动查询 COM 对象的属性。缺点是我认为你没有智能感知,所以你必须确切地知道你想检查什么。

    【讨论】:

    • 是的,它“手动”工作..但我正在寻找一种方法来正确显示整个对象
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2019-04-02
    相关资源
    最近更新 更多