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