Как я могу вызвать метод для пользовательского объекта, созданного в JavaScript с использованием C #? - PullRequest
2 голосов
/ 17 июня 2010

У меня есть элемент управления WebBrowser. Я добавил JavaScript в тег head и вижу, что он работает, как и ожидалось, добавив предупреждение. Внутри этого js я создаю функцию и добавляю несколько членов к ее прототипу так:

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 #?

Ответы [ 2 ]

0 голосов
/ 22 января 2011

Оказывается, что ключевое слово "dynamic" недостаточно умно, чтобы понять это по какой-то причине. Что вы можете сделать, это привести объект COM, возвращенный из InvokeScript, в IExpando (или IReflect) и вызвать метод InvokeMember. Я создал класс, который наследуется от DynamicObject, который переопределяет все методы TryXYZ и преобразует их в вызовы методов IReflect / IExpando. Затем вы можете взаимодействовать с объектом, как показано выше.

0 голосов
/ 18 июня 2010

Попробуйте передать пустой массив System.object в качестве второго аргумента InvokeScript, а затем вызовите test.run ();

...