我有一个界面 - 其中一个成员返回一个对象类型的变量。
在尝试使用此返回变量时,我发现它不仅仅是“对象”,而实际上是“ mshtml.HTMLDocumentClass ” ,您可以在以下屏幕截图中看到:
在我的情况下,这是完美的,因为它(通过代码洞察)出现,然后该对象支持我实际尝试使用的许多方法和属性(我将通过后期绑定使用)
问题是:
所以我可以转换我的代码:
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的声明:
并且对象的声明让我接受了对象的声明:
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交互时。
答案 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。好吧,也许你可以,但那将是麻烦。