2010-06-17 37 views
2

我有一個WebBrowser控件。我在head標籤中添加了一些JavaScript,並且可以通過添加警報來看到它按預期工作。裏面的這個js我創建一個功能,增加了一些成員,它的原型就像這樣:如何調用使用C#在JavaScript中創建的自定義對象的方法?

function test() { 
} 

test.prototype.run = function() { 
    alert('success!') 
} 

function createTest() { 
    return new test() 
} 

然後回來的C裏面#我做:

dynamic test = this.browser.InvokeScript("createTest"); 
test.run(); 

我可以看到,測試對象是一些ComObject,但是當我調用run()時,什麼也沒有發生。我沒有錯誤,但沒有任何反應。有誰知道如何調用這種類型的自定義對象?

另外假設我想擺脫createTest()方法,我如何從C#中創建一個新的測試實例?

此外,對於獎勵積分,有什麼特別的我需要知道附加事件到這個自定義對象(在一個'完整'成員),這樣它會回調到我的C#代碼?

+1

我不知道爲什麼我必須這樣做,但如果我使用反射,我可以得到InvokeMember MemberInfo對象的位置,然後我可以調用它,它實際上會調用js對象上的成員!我不知道爲什麼動態對象已經不這樣做了......但我會發布我創建的包裝代碼來做到這一點,除非有人能夠首先找到更清晰的方法。 – 2010-06-17 22:07:15

回答

0

原來,由於某些原因,「dynamic」關鍵字不夠聰明。你可以做的是將從InvokeScript返回的COM對象轉換爲IExpando(或IReflect)並調用InvokeMember方法。我創建了一個繼承自DynamicObject的類,它覆蓋了所有TryXYZ方法,並將它們轉換爲IReflect/IExpando方法調用。然後你可以像上面的代碼片段一樣與對象交互。

+0

你可以檢查這個問題,請??: http://stackoverflow.com/questions/5009189/cant-call-method-of-a-javascript-object-created-in-code-injected-to-webbrowsers – Juan 2011-02-15 21:22:43

0

嘗試傳入一個空的System.object數組作爲InvokeScript的第二個參數,然後調用test.run();

+0

沒有骰子。同樣的結果。 – 2010-06-18 15:56:04

相關問題