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#
已知解决方案-使用ObjectForScriptingWebBrowser
属性,并使用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#,我们仍然需要interfaceIFoo
。我们需要在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警告