我想弄清楚如何在頁面中的Javascript中調用BHO對象中的C#方法。我發現瞭如何做到這一點在C++/ATL /多個網頁的COM如:從Javascript調用C#BHO方法
Browser Helper Objects and Scripts Options
Calling BHO method from Javascript?
我試圖跟着在C#中正確地實現它,但我不能讓它工作可能是由於我有一些我不完全瞭解的明顯的COM問題。
我正在使用C#4.0。
這裏是代碼的相關部分:
using SHDocVw;
using mshtml;
using System.Runtime.InteropServices;
[ComVisible(true),
Guid("300736C4-DCDA-4DB0-90AD-4510A12EBBC6"),
ClassInterface(ClassInterfaceType.None),
ProgId("My Extension")]
public class BrowserHelperObject : IObjectWithSite
{
const int DISPATCH_PROPERTYPUT = 4;
const int FDEX_NAME_ENSURE = 2;
const uint LOCALE_USER_DEFAULT = 0x0400;
WebBrowser browser;
...
public void OnDocumentComplete(dynamic frame, ref dynamic url)
{
...
var window = browser.Document.parentWindow;
int pid = 0;
window.GetDispId("myExtension", FDEX_NAME_ENSURE, ref pid);
System.Runtime.InteropServices.ComTypes.DISPPARAMS dispParms = new System.Runtime.InteropServices.ComTypes.DISPPARAMS();
dispParms.cArgs = 1;
dispParms.cNamedArgs = 0;
dispParms.rgvarg = ???;
dispParms.rgdispidNamedArgs = IntPtr.Zero;
System.Runtime.InteropServices.ComTypes.EXCEPINFO einfo = new System.Runtime.InteropServices.ComTypes.EXCEPINFO();
window.Invoke(pid, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, ref dispParms, this, ref einfo);
...
}
的COM引用不後悔回答自己的問題。因爲,我)人們尋找答案,而不是對人誰回答,ii)你有一個問題張貼和你能夠回答它意味着你已經在它上面..這真是一件好事..恭喜...... – Tirumudi 2012-08-03 08:10:12
嗨定點。你能發佈一個完整的工作原型嗎?我試圖正確地repro這和我的window.myExtension仍然'undefined' 我發佈了這個問題與我的完整源代碼[here](http://stackoverflow.com/questions/15068872/calling-c-sharp-bho-methods- from-javascript-still-not-working) – 2013-02-25 15:08:11
對於我來說,只要我在頁面中加載了一些javascript,在沒有任何外部腳本引用的頁面上就沒有問題,只要我有一個外部腳本引用失敗。同樣奇怪的是,一旦它開始失敗,它就會在之前的工作頁面上失敗。 – 2013-04-10 15:50:42