无法将类型为“System.__ComObject”的 COM 对象强制转换为类类型“mshtml.HTMLInputElementClass

本文介绍了解决在VS2008环境下使用WebBrowser控件点击HTML元素时出现InvalidCastException异常的方法,提供了两种解决方案,一种是修改类型转换方式,另一种是调整项目的平台目标。

环境:
VS2008+Win7 64bit

代码:

 public string Execute(WebBrowser browser, HtmlElement btn)
        {
            bool loadFinished = false;
            int counterTimeOut = 500;
            string message;

            try
            {

                browser.DocumentCompleted += delegate { loadFinished = true; };
                 HTMLInputElementClass iElement = (HTMLInputElementClass)btn.DomElement;
                iElement.click();

                while (!loadFinished && counterTimeOut > 0)
                {
                    Thread.Sleep(100);
                    Application.DoEvents();
                    counterTimeOut--;
                }

                message = string.Format("Button {0} clicked", btn.InnerHtml.ToString());
            }
            catch (Exception ex)
            {
                message = ex.ToString();
            }

            return message;
        }


症状:

执行到 HTMLInputElementClass iElement = (HTMLInputElementClass)btn.DomElement; 报错

System.InvalidCastException: 无法将类型为“System.__ComObject”的 COM 对象强制转换为类类型“mshtml.HTMLInputElementClass”。进入 CLR 且不支持 IProvideClassInfo 或没有注册任何互操作程序集的 COM 组件都将包装在 __ComObject 类型中。这种类型的实例不能强制转换为任何其他类;不过,只要基础 COM 组件支持对接口 IID 的 QueryInterface 调用,就能将这些实例强制转换为接口。


解决:
1、直接改为 HTMLInputElement iElement = (HTMLInputElement)btn.DomElement;

2、绝杀方法
将目标平台由“Any CPU” 改为X86
HTMLInputElement iElement = (HTMLInputElement)btn.DomElement;
HTMLInputElementClass iElement = (HTMLInputElementClass)btn.DomElement;
两个方法都不报错



iHTMLWindow.window {mshtml.HTMLWindow2Class} IHTMLWindow2_Image: “((mshtml.HTMLWindow2Class)iHTMLWindow.window).IHTMLWindow2_Image”引发了类型System.UnauthorizedAccessException”的异常 IHTMLWindow2_Option: “((mshtml.HTMLWindow2Class)iHTMLWindow.window).IHTMLWindow2_Option”引发了类型System.UnauthorizedAccessException”的异常 IHTMLWindow2__newEnum: “((mshtml.HTMLWindow2Class)iHTMLWindow.window).IHTMLWindow2__newEnum”引发了类型System.UnauthorizedAccessException”的异常 IHTMLWindow2_clientInformation: “((mshtml.HTMLWindow2Class)iHTMLWindow.window).IHTMLWindow2_clientInformation”引发了类型System.UnauthorizedAccessException”的异常 IHTMLWindow2_closed: false IHTMLWindow2_defaultStatus: “((mshtml.HTMLWindow2Class)iHTMLWindow.window).IHTMLWindow2_defaultStatus”引发了类型System.UnauthorizedAccessException”的异常 IHTMLWindow2_document: “((mshtml.HTMLWindow2Class)iHTMLWindow.window).IHTMLWindow2_document”引发了类型System.UnauthorizedAccessException”的异常 IHTMLWindow2_event: “((mshtml.HTMLWindow2Class)iHTMLWindow.window).IHTMLWindow2_event”引发了类型System.UnauthorizedAccessException”的异常 IHTMLWindow2_external: “((mshtml.HTMLWindow2Class)iHTMLWindow.window).IHTMLWindow2_external”引发了类型System.UnauthorizedAccessException”的异常 IHTMLWindow2_frames: {mshtml.HTMLWindow2Class} IHTMLWindow2_history: “((mshtml.HTMLWindow2Class)iHTMLWindow.window).IHTMLWindow2_history”引发了类型System.UnauthorizedAccessException”的异常 IHTMLWindow2_length: 0 IHTMLWindow2_location: {mshtml.HTMLLocationClass} IHTMLWindow2_name: “((mshtml.HTMLWindow2Class)iHTMLWindow.window).IHTMLWindow2_name”引发了类型System.UnauthorizedAccessException”的异常 IHTMLWindow2_navigator: “((mshtml.HTMLWindow2Class)iHTMLWindow.window).IHTMLWindow2_navigator”引发了类型System.UnauthorizedAccessException”的异常 IHTMLWindow2_offscreenBuffering: “((mshtml.HTMLWindow2Class)iHTMLWindow.window).IHTMLWindow2_offscreenBuffering”引发了类型System.UnauthorizedAccessException”的异常
最新发布
08-16
### 跨域访问限制与 `IHTMLWindow2` 权限异常 在使用 `IHTMLWindow2` 接口访问 HTML 文档的 `window` 对象属性时,出现 `System.UnauthorizedAccessException` 异常通常与跨域安全策略有关。MSHTML 引擎强制实施了浏览器级别的安全限制,当尝试访问的文档来源(协议、域名、端口)与当前页面不同时,会抛出访问被拒绝的异常[^1]。 #### 跨域安全策略限制 如果 HTML 文档加载自远程服务器(如 `http://example.com`),而尝试访问其 `window` 对象的方法或属性时,若当前应用程序的上下文与该页面的源不匹配,MSHTML 会阻止此类访问以防止脚本注入和信息泄露风险。这种限制在 `WebBrowser` 控件中表现尤为明显,尤其是在加载外部网页时[^2]。 #### 本地文件与安全区域 当加载的是本地 HTML 文件(如 `file://C:\test.html`)时,也可能遇到类似的访问拒绝问题。Windows 的 Internet Explorer 安全模型将本地文件视为“本地计算机”区域,该区域默认不允许脚本访问外部资源或执行某些操作。可以通过修改注册表或使用 `FEATURE_BROWSER_EMULATION` 标志来调整安全策略,例如启用更高版本的 IE 模式或放宽本地文件的安全限制。 #### 使用 `execScript` 与 `window` 对象交互 在尝试通过 `IHTMLWindow.execScript` 方法执行脚本时,若目标页面处于受限安全区域或跨域加载,也可能导致 `UnauthorizedAccessException`。确保调用脚本的上下文与页面来源一致,并在必要时通过 `window.postMessage` 实现跨域通信。例如: ```csharp iHTMLWindow.execScript("window.postMessage('hello', '*');", "JavaScript"); ``` 此外,可以监听 `window` 的 `onmessage` 事件来接收和处理跨域消息,从而避免直接访问受限对象。 #### 本地调试与测试策略 为了排除跨域限制,在开发和测试阶段建议加载本地 HTML 文件或使用相同域的测试服务器。确保 Web 服务器配置了正确的 CORS 头部,如 `Access-Control-Allow-Origin`,以允许来自本地应用程序的请求。例如,在 IIS 中配置如下响应头: ```http Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET, POST Access-Control-Allow-Headers: Content-Type ``` #### 异常捕获与日志记录 在代码中捕获 `UnauthorizedAccessException` 并记录详细的上下文信息,有助于识别问题根源。例如: ```csharp try { iHTMLWindow.execScript("function confirm(str){return true;}", "javaScript"); } catch (UnauthorizedAccessException ex) { Console.WriteLine($"访问被拒绝: {ex.Message}"); // 输出调试信息,如当前文档 URL、安全区域等 } ``` 通过检查 `webBrowser.Document.Window.Frames[0].Url` 的值,可以确认当前访问的页面来源是否符合预期,并据此判断是否为跨域问题[^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值