代码之家  ›  专栏  ›  技术社区  ›  prostynick

.NETWebBrowser中HTML与WinForms应用程序的双向通信

  •  1
  • prostynick  · 技术社区  · 15 年前

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

    解决方案已知-使用 ObjectForScripting 财产 控件 以及使用 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)

    我应该怎么做才能传递类的对象 从JS到C#或者如何将JS对象快速转换到C# 反对?

    2 回复  |  直到 15 年前
        1
  •  1
  •   hurst    8 年前

    类型系统在jscript中较弱,因此不能使用早期绑定类。我建议你去 make your class automatable and register your project's type library for late binding 因此可以通过新的ActiveXObject在jscript中调用它。

        2
  •  1
  •   Dagrooms    10 年前

    我发现至少 .

    [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)。这些类型,尤其是接口,应该用在具有 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。

    第二 解决方案是不创建类库,而将这些类型留在app 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。

    推荐文章