Visual studio VisualStudio:如何确定此类型的定义位置?

Visual studio VisualStudio:如何确定此类型的定义位置?,visual-studio,Visual Studio,我有一个接口,其中一个成员返回类型为Object的变量 在尝试使用此返回变量时,我发现它不仅仅是一个“对象”,而是一个“mshtml.HTMLDocumentClass”,如下图所示: 在我的例子中,这是完美的,因为看起来(通过代码洞察),对象支持我实际尝试使用的许多方法和属性(我将通过后期绑定使用这些方法和属性) 问题是: 这种类型来自哪里 它的定义是什么 因此,我可以将代码转换为: object webDocument = ie.Document; 到 如果您想知道,ie声明为:

我有一个接口,其中一个成员返回类型为Object的变量

在尝试使用此返回变量时,我发现它不仅仅是一个“对象”,而是一个“mshtml.HTMLDocumentClass”,如下图所示:

在我的例子中,这是完美的,因为看起来(通过代码洞察),对象支持我实际尝试使用的许多方法和属性(我将通过后期绑定使用这些方法和属性)

问题是:

  • 这种类型来自哪里
  • 它的定义是什么
因此,我可以将代码转换为:

object webDocument = ie.Document;


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

IWebBrowser2 ie;
IWebBrowser2的ie声明文件为:

[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
你会弄错的


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


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

而且对象的声明也让我想到了对象的声明


我有一个非常好的建议:

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,版本=7.0.3300.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a

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


因此,在我的例子中,最糟糕的是,当我试图直接与COM进行互操作时,有人自动添加对托管程序集的引用。

对您试图实现的目标有点困惑

您不能使用Visual Studio中的“转到定义”上下文菜单打开对象浏览器来定位类型吗

您可以使用该方法获取有关您获得的特定对象的信息

下面是一个例子:

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

中真正包含的内容的类型信息。在MSDN上快速搜索可进入此页面,该页面描述了如何获取文档界面:

注意:我无法尝试任何一种方法,因为我被VS.80困住了。Nuff说,只需添加对Microsoft.mshtml的引用即可


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

我该如何定义。对象文件?这让我分别谈到Object和IWebDocument2.Document的声明,而不是{mshtml.HTMLDocumentClass}的声明。好的,所以它实际上无处不在-google命令,但第一个结果是一个MSDN页面。问题是它不适用于.NET。没有可以查询IHTMLDocument2的IDispatch接口类型。这是一种完全不同于当时预期的用法;在这种情况下,幸运的是,现在客户必须拥有Microsoft.mshtml程序集。也许,但这并不能阻止应用程序在未安装完全相同版本的Microsoft.mshtml PIA时崩溃。那么,您就错过了GAC的要点。它包含同一DLL的多个版本,因此应用程序可以选择所需的版本。换句话说,您可以依赖此PIA,就像您可以依赖框架一样。“问题是,现在客户必须有Microsoft.mshtml程序集。”我不认为您可以同时拥有这两种方式。要么您要引用并使用该类型,要么您不。。。
var t = ie.Document.GetType()