MSHTMLHTMLHeadElementClassCOM错误我目前正在使用MSHTML将JavaScript代码插入网站。我引用了MicrosoftHTML对象库并输入了这段代码。IHTMLDocument2doc=BrowserHost.DocumentasHTMLDocumentClass;IHTMLElementhead=(IHTMLElement)((IHTMLElementCollection)doc.all.tags("head")).item(null,0);IHTMLScriptElementscriptObject=(IHTMLScriptElement)doc.createElement("脚本");scriptObject.type=@"文本/javascript";scriptObject.text=TTS.TTSWebFactory.GetJavascript();((HTMLHeadElementClass)head).appendChild((IHTMLDOMNode)scriptObject);我在脚本的最后一行收到错误消息。无法将“System._ComObject”类型的COM对象转换为类类型“mshtml.HTMLHeadElementClass”。进入CLR且不支持IProvideClassInfo或未注册任何iterop程序集的COM组件将包装在_ComObject类型中。这种类型的实例不能转换为任何其他类;但是只要底层COM组件支持对接口IID的QueryInterface调用,它们就可以转换为接口我对COM没有太多经验,重要的是保留代码中的最后一行,谁能帮我了解这意味着什么以及我该如何解决?您可以从mshtml.tlb等类型库中得到一个非常糟糕的互操作类问题。类型库导入器从类型库中的coclass定义生成合成.NET类。您可以从类型名称中识别它们,类型名称以“Class”结尾并以接口类型的名称开头。它们很有用,允许您像对待.NET类一样对待COM组件类。但是,它们可能会导致严重的版本控制问题。当我在我的机器上使用oleview.exe查看mshtml.tlb时,我看到了HTMLHeadElementcoclass的定义:[uuid(3050F493-98B5-11CF-BB82-00AA00BDCE0B),noncreatable]coclassHTMLHeadElement{[default]dispinterfaceDispHTMLHeadElement;[默认,来源]dispinterfaceHTMLElementEvents;[来源]dispinterfaceHTMLElementEvents2;接口IHTMLElement;接口IHTMLElement2;接口IHTMLElement3;接口IHTMLElement4;接口IHTMLUniqueName;接口IHTMLDOMNode;接口IHTMLDOMNode2;接口IHTMLElement5;接口IHTMLDOM构造函数;接口IHTMLHeadElement;接口IHTMLHeadElement2;};当我右键单击源代码中的mshtml.HtmlHeadElementClass并选择转到定义时,我看到:publicclassHTMLHeadElementClass:DispHTMLHeadElement,HTMLHeadElement,HTMLElementEvents_Event,IHTMLElement,IHTMLElement2,IHTMLElement3,IHTMLElement4,IHTMLUniqueName,IHTMLDOMNode,IHTMLEVEventNode2EHTMLHeadts{//Lotsofmembers//...}注意两者之间的不匹配。我从Oleview获得的那个有额外的接口,IHtmlElement5和IHtmlHeadElement2。原因很简单,我的机器上安装了IE9。互操作定义来自mshtmlPIA。这是一个旧版本,可能追溯到IE7。可怕的问题是新的IHtmlElement5接口被插入到继承列表中。这是一个非常严重的错误,至少就.NET代码而言是这样。纯COM代码根本无所谓,直接用接口,用QueryInterface向coclass要接口指针即可。但是,对于.NET包装类,IHTMLDOMNode2之后的所有方法都具有错误的偏移量。因此,如果您调用IHTMLHeadElement.appendChild方法,您最终会调用错误的方法。这是一个无法解决的问题。您可以卸载PIA并生成您自己的interop.mshtml.dll互操作库,它将在您的计算机上正常工作。但它在另一台没有安装IE9的机器上不能正常工作。但是,有一个很好的解决方法,就是不要使用XxxClass类。仅使用接口类型。它应该看起来像这样(在Winforms应用程序中测试):vardoc=(IHTMLDocument2)webBrowser1.Document.DomDocument;varheadItems=(IHTMLElementCollection)doc.all.tags("head");varscriptObject=(IHTMLScriptElement)doc.createElement("script");scriptObject.type=@"文本/javascript";//scriptObject.text=TTS.TTSWebFactory.GetJavascript();varnode=(IHTMLDOMNode)headItems.item(null,0);节点。appendChild((IHTMLDOMNode)scriptObject);我特意使用转换为(IHTMLDOMNode)而不是(IHTMLHeadElement),因为较小的接口已经足以访问item元素。以上就是C#学习教程的全部内容:MSHTMLHTMLHeadElementClassCOM错误分享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
