Я нашел как минимум два решения .
Первый , довольно очевидно, это то, что предложил Шэн Цзян.Вам необходимо создать отдельную библиотеку классов с этими типами:
[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.