C# .Net WebBrowser中HTML与WinForms应用程序之间的双向通信

C# .Net WebBrowser中HTML与WinForms应用程序之间的双向通信,c#,javascript,interop,browser,com-interop,C#,Javascript,Interop,Browser,Com Interop,使用WebBrowser控件时,我希望将一个对象从javascript代码传递到C# 已知解决方案-使用ObjectForScriptingWebBrowser属性,并使用window.external从javascript代码调用方法 我知道怎么做,但我想用javascript创建具有给定类型的对象,并将其传递给C#,而不使用object或dynamic。例如: 我想从JS调用C#中的这个方法: 其中Foo是: [ComVisible(true)] public class Foo {

使用
WebBrowser
控件时,我希望将一个对象从javascript代码传递到C#

已知解决方案-使用
ObjectForScripting
WebBrowser
属性,并使用
window.external
从javascript代码调用方法

我知道怎么做,但我想用javascript创建具有给定类型的对象,并将其传递给C#,而不使用
object
dynamic
。例如:

我想从JS调用C#中的这个方法:

其中
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
对象?

类型系统在jscript中较弱,因此不能有早期绑定类。我建议您这样做,以便可以通过新的ActiveXObject在jscript中调用它。

我发现至少有两种解决方案

首先,很明显,这是盛江的建议。您需要使用以下类型创建单独的类库:

[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));
public IFoo CreateFoo()
{
    return new Foo() { Bar = "asdf" };
}

public string Bar(IFoo foo)
{
    return foo.Bar;
}
不幸的是,类库必须注册,您将从IE获得ActiveX警告

第二个解决方案是不创建类库,而不是将这些类型保留在app exe中。如果要将对象从javascript传递到C#,我们仍然需要interface
IFoo
。我们需要在C端为javascript创建对象的方法:

var foo = new ActiveXObject("ClassLibrary1.Foo");
foo.Bar = "qwer";
alert(external.Bar(x));
var fooFromExternal = external.Bar2();
alert(fooFromExternal);
alert(external.Bar(fooFromExternal));
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互操作注册任何内容,IE也不会发出ActiveX警告