Двусторонняя связь между HTML в .Net WebBrowser и приложении WinForms - PullRequest
1 голос
/ 13 июля 2010

При использовании WebBrowser управления я хотел бы передать объект из кода JavaScript в C #.

Решение известно - использование свойства ObjectForScripting WebBrowser и вызов методов из кода JavaScript с использованием window.external.

Я знаю, как это сделать, но я хотел бы создать объектс данным типом в javascript и передать его в C # без использования object или dynamic.Пример:

Я хотел бы вызвать из JS этот метод в C #:

public void Test(Foo foo)
{
    //do something
}

Где Foo:

[ComVisible(true)]
public class Foo
{
    public string Bar;
}

Я знаю, как вызвать этиметоды:

public void Test2(object foo)
{
    //do something
}

public void Test3(dynamic foo)
{
    //do something
}

, но я бы хотел использовать первый - Test(Foo foo)

Что мне нужно сделать, чтобы можно было передавать объект класса Foo из JS в C #или как привести объект JS на лету к объекту C # Foo?

Ответы [ 2 ]

1 голос
/ 14 июля 2010

Я нашел как минимум два решения .

Первый , довольно очевидно, это то, что предложил Шэн Цзян.Вам необходимо создать отдельную библиотеку классов с этими типами:

[ComVisible(true)]
public interface IFoo
{
    string Bar { get; set; }
}

[ComVisible(true)]
public class Foo : IFoo
{
    public string Bar { get; set; }
}

Эта библиотека типов должна быть зарегистрирована (Project / Properties / Build / Register for COM interop).Эти типы, особенно интерфейсы, должны использоваться в методах в exe, который имеет элемент управления WebBrowser.Например:

public string Bar(IFoo foo)
{
    return foo.Bar;
}

public IFoo Bar2()
{
    return new Foo() { Bar = "asdf" };
}

Теперь мы можем использовать эти типы в javascript:

var foo = new ActiveXObject("ClassLibrary1.Foo");
foo.Bar = "qwer";
alert(external.Bar(x));
var fooFromExternal = external.Bar2();
alert(fooFromExternal);
alert(external.Bar(fooFromExternal));

К сожалению, библиотека классов должна быть зарегистрирована , и вы получите Предупреждение ActiveX от IE.

Второе решение состоит в том, чтобы не создавать библиотеку классов, а не оставлять эти типы в приложении exe.Нам все еще нужен интерфейс IFoo, если мы хотим передать объекты из JavaScript в C #.И нам нужны методы для создания объектов на стороне C # для javascript:

public IFoo CreateFoo()
{
    return new Foo() { Bar = "asdf" };
}

public string Bar(IFoo foo)
{
    return foo.Bar;
}

Использование Javascript:

var foo = external.CreateFoo();
alert(foo.Bar);
foo.Bar = "qwer";
alert(external.Bar(foo));

Нам не нужно ничего регистрировать для взаимодействия COM и не будет никаких предупреждений ActiveX от IE.

1 голос
/ 14 июля 2010

Система типов слабее в jscript, поэтому у вас не может быть классов раннего связывания. Я предлагаю вам сделать ваш класс автоматизируемым и зарегистрировать библиотеку типов вашего проекта для позднего связывания , чтобы он мог вызываться в jscript через новый ActiveXObject.

...