Visual Studio:如何确定此类型的定义?

时间:2009-01-27 19:08:42

标签: visual-studio

我有一个界面 - 其中一个成员返回一个对象类型的变量。

在尝试使用此返回变量时,我发现它不仅仅是“对象”,而实际上是“ mshtml.HTMLDocumentClass ” ,您可以在以下屏幕截图中看到:

alt text

在我的情况下,这是完美的,因为它(通过代码洞察)出现,然后该对象支持我实际尝试使用的许多方法和属性(我将通过后期绑定使用)

问题是:

  • 这种类型来自哪里?
  • 在何处定义

所以我可以转换我的代码:

object webDocument = ie.Document;

mshtml.HTMLDocumentClass webDocument = (mshtml.HTMLDocumentClass)ie.Document;

如果您想知道,被声明为:

IWebBrowser2 ie;

和IWebBrowser2的ie.Document声明是:

[ComImport, DefaultMember("Name"), 
      Guid("D30C1661-CDAF-11D0-8A3E-00C04FC9E26E"), 
      InterfaceType(ComInterfaceType.InterfaceIsIDispatch),
      SuppressUnmanagedCodeSecurity]
public interface IWebBrowser2
{
   ...
   object Document { [return: MarshalAs(UnmanagedType.IDispatch)] [DispId(0xcb)] get; }
   ...
}

所以它是对象,也支持 IDispatch 。在我的任何代码中都没有提到名为“mshtml.HTMLDocumentClass”的类型。

注意:如果您认为可以将其转换为

System.Windows.Forms.HtmlDocument
你会错的。


如果您想知道我为什么这样做,那么将所有变量名称和类类型更改为随机字符串以混淆示例。


chakrit建议使用“*转到 ie.Document 成员的定义**,不幸地转到了ie.Document的声明:

alt text

并且对象的声明让我接受了对象的声明:

alt text


chakrit有一个非常好的建议:

public static string TellMeAboutThisObject(object obj)
{
   Type t = obj.GetType();
   Assembly asm = t.Assembly;

   return 
         "Type Name: "+t.FullName+Environment.NewLine+
         "Namspace: " + t.Namespace+Environment.NewLine+
         "From assembly: "+ asm.FullName+Environment.NewLine+
         "Located at: "+asm.Location;
}

在我的情况下返回:

  

类型名称: mshtml.HTMLDocumentClass

     

Namspace: mshtml

     

来自汇编: Microsoft.mshtml,Version = 7.0.3300.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a

     

位于: C:\ Windows \ assembly \ GAC \ Microsoft.mshtml \ 7.0.3300.0__b03f5f7f11d50a3a \ Microsoft.mshtml.dll

所以,在我的情况下,有人自动添加对托管程序集的引用是最严重的事情 - 当我试图直接与COM交互时。

4 个答案:

答案 0 :(得分:2)

在MSDN上快速搜索让我进入此页面,该页面描述了如何获取文档界面: About MSHTML
注意:我无法尝试任何此操作,因为我遇到了VS.80

答案 1 :(得分:1)

对于你想要完成的事情有点困惑。

您是否可以使用Visual Studio中的“转到定义”上下文菜单调出对象浏览器来找到类型?

go to definition http://chakrit.net/files/temp/so_go_to_definition.png

答案 2 :(得分:1)

您可以使用Object.GetType()方法获取有关您获得的特定对象的信息。

以下是一个例子:

using System;

static class Program
{
    static void Main()
    {
        var obj = new { Random = "Object" } as object;

        var t = obj.GetType();

        var asm = t.Assembly;

        Console.WriteLine("Type name     : " + t.FullName);
        Console.WriteLine("Namspace      : " + t.Namespace);
        Console.WriteLine("From assembly : " + asm.FullName);
        Console.WriteLine("Located at    : " + asm.Location);

        Console.ReadKey();
    }
}

或者在你的情况下......

var t = ie.Document.GetType()

...应该为您提供有关ie.Document内的内容的类型信息。

答案 3 :(得分:1)

只需添加对 Microsoft.mshtml 的引用即可。 '努夫说。

已添加:好的,还有一些话 - .NET程序通过这些互操作程序集与COM对象一起运行。如果在Visual Studio中添加对COM对象的引用,VS将为您生成一个。对于WebBrowser,已经预先生成了一个,因为它经常被使用。但是你不能“直接”使用COM。好吧,也许你可以,但那将是麻烦。