Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Javascript调用C#BHO方法_C#_Internet Explorer_C# 4.0_Com_Bho - Fatal编程技术网

从Javascript调用C#BHO方法

从Javascript调用C#BHO方法,c#,internet-explorer,c#-4.0,com,bho,C#,Internet Explorer,C# 4.0,Com,Bho,我试图弄清楚如何从页面内的Javascript调用BHO对象中的C#方法。我在C++/ATL/Com中找到了许多关于如何执行此操作的页面,例如: 我已经试着在C#中正确地实现它,但我无法让它工作,可能是因为我没有完全理解一些明显的COM问题 我正在使用C#4.0 以下是守则的相关部分: 使用SHDocVw; 使用mshtml; 使用System.Runtime.InteropServices; [ComVisible(真实), Guid(“300736C4-DCDA-4DB0-90AD-4

我试图弄清楚如何从页面内的Javascript调用BHO对象中的C#方法。我在C++/ATL/Com中找到了许多关于如何执行此操作的页面,例如:

我已经试着在C#中正确地实现它,但我无法让它工作,可能是因为我没有完全理解一些明显的COM问题

我正在使用C#4.0

以下是守则的相关部分:

使用SHDocVw;
使用mshtml;
使用System.Runtime.InteropServices;
[ComVisible(真实),
Guid(“300736C4-DCDA-4DB0-90AD-4510A12EBBC6”),
ClassInterface(ClassInterfaceType.None),
ProgId(“我的扩展”)]
公共类BrowserHelperObject:IObjectWithSite
{
const int DISPATCH_PROPERTYPUT=4;
const int FDEX_NAME_sure=2;
consuint LOCALE\u USER\u默认值=0x0400;
网络浏览器;
...
公共void OnDocumentComplete(动态框架,参考动态url)
{
...
var窗口=browser.Document.parentWindow;
int-pid=0;
GetDispId(“myExtension”,FDEX\u NAME\u sure,ref-pid);
System.Runtime.InteropServices.ComTypes.DISPPARAMS dispParms=新的System.Runtime.InteropServices.ComTypes.DISPPARAMS();
dispParms.cArgs=1;
disparms.cNamedArgs=0;
disparms.rgvarg=???;
dispParms.rgdispidNamedArgs=IntPtr.Zero;
System.Runtime.InteropServices.ComTypes.EXCEPINFO einfo=新建System.Runtime.InteropServices.ComTypes.EXCEPINFO();
调用(pid、区域设置\用户\默认值、分派\属性输出、ref dispParms、this、ref einfo);
...
}

我不想回答我自己的问题,但我真的觉得社区应该知道答案,因为C#4.0简洁美观,很多人似乎都有这个问题

确保正确显示浏览器辅助对象:

[ComVisible(真),
Guid(“DA8EA345-02AE-434E-82E9-448E3DB7629E”),
ClassInterface(ClassInterfaceType.None),ProgId(“MyExtension”),
ComDefaultInterface(类型(IExtension))]
公共类BrowserHelperObject:IObjectWithSite,IExtension
{
...
公共int Foo(字符串s){…}
...
公共void OnDocumentComplete(动态框架,参考动态url)
{
...
动态窗口=browser.Document.parentWindow;
IExpando windowEx=(IExpando)窗口;
windowEx.AddProperty(“myExtension”);
window.myExtension=this;
...
}
...
}
您需要为您的扩展定义:

[ComVisible(真),
Guid(“4C1D2E51-018B-4A7C-8A07-618452573E42”),
InterfaceType(ComInterfaceType.InterfaceIsDual)]
公共接口扩展
{
[附表(1)]
int Foo(字符串s);
...
}
您可以在javascript中访问浏览器帮助对象,因此:

var result=window.myExtension.Foo(“bar”);
或者只是

var result=myExtension.Foo(“bar”);

就这样。别再把头撞在墙上了,去庆祝吧!

另外,在你添加属性后,你需要确保释放window和windowEx的COM引用。不要为回答你自己的问题而后悔。因为,i)人们寻找答案,而不是回答的人;ii)你发布了一个问题,你可以nswer它意味着你已经做过了这是一件非常好的事情恭喜…Hi fixedpoint.你能发布一个完整的工作原型吗?我试图完全重新编译这个,我的窗口。myExtension仍然是“未定义的”我用完整的源代码发布了这个问题如果它不适合你试试这个:浏览器对象需要是“IWebBro”的一个实例wser'not'IWebBrowser2'可能您的实现类中没有包含ComDefaultInterface(typeof(IExtension)),这就是为什么它不起作用的原因在我的情况下IExtension的GUID是不同的。我使用了
C:\>reg query HKLM/s/f IExtension/d/e/C
来获得这样的输出
HKEY\u LOCAL\u MACHINE\SOFTWARE\Classes\Interface\{B05651CD-9B10-425E-B616-1FCD828DB3B1}
guid在大括号中。请详细说明一下。