JS和C#访问遇到QueryInterface调用出错
Posted 左正
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS和C#访问遇到QueryInterface调用出错相关的知识,希望对你有一定的参考价值。
在原来的WinForm里,我们只要在窗体类的头部添加属性[System.Runtime.InteropServices.ComVisibleAttribute(true)],然后 webBrowser1.ObjectForScripting = this;这样设置完后,页面上的JS就能访问窗体类的方法了,但是添加WeifenLuo.WinFormsUI.Docking.DockContent作为窗体的父类后如果这样设置却会出现如下提示:
执行了QueryInterface调用,请求提供 COM 可见的托管类“自己的类”的默认IDispatch 接口。不过,由于该类没有显式默认接口,并且是从非 COM 可见的类“WeifenLuo.WinFormsUI.Docking.DockContent”派生的,QueryInterface 调用将失败。这样做的目的是避免非 COM 可见的基类受 COM 版本规则的约束。
方法一:非常明显是由于WeifenLuo.WinFormsUI.Docking.DockContent不是可见类。所以可以直接到该类前面添加
[System.Runtime.InteropServices.ComVisibleAttribute(true)]即可。
方法二:为了不修改开源的组件,可以通过修改使用过程;
webBrowser1.ObjectForScripting = this这句语句就是让对象和Js脚本能够关联上,且该对象是能够ComVisibleAttribute的属性,我们知道DockContent不可以ComVisibleAttribute,所以在它继承下的类当使用到该类后,也就是不能ComVisibleAttribute,Form是ComVisibleAttribute的;所以我们可以构造一个类是ComVisibleAttribute的,通过webBrowser1.ObjectForScripting = this来绑定我们自己的那个类。那么浏览器调用c#的方法,当然是在该类里的方法。----也就是构造一个中间类来沟通JS和C#数据访问。
附加:若是想去除该异常提示可以:
调试-->异常--->Managed Debugging Assistants---> NonComVisibleBaseClass 将其复选框去除点击确定即可。
以上是关于JS和C#访问遇到QueryInterface调用出错的主要内容,如果未能解决你的问题,请参考以下文章
Firefox 6:XPCOM 组件中的 QueryInterface(nsIDOMWindow::GetIID() 问题,用于从 js 传递的浏览器内容窗口