【问题标题】:Two-Way Communication Between HTML in .Net WebBrowser and WinForms application.Net WebBrowser 和 WinForms 应用程序中的 HTML 之间的双向通信
【发布时间】:2010-07-13 11:06:49
【问题描述】:

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

解决方案已知 - 使用 WebBrowserObjectForScripting 属性并使用 window.external 从 javascript 代码中调用方法。

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

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

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

【问题讨论】:

    标签: c# javascript interop browser com-interop


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我找到了至少 两个解决方案

      首先,很明显,是姜生建议的。您需要使用这些类型创建一个单独的类库:

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

      必须注册此类型库(用于 COM 互操作的项目/属性/构建/注册)。这些类型,尤其是接口,应该在具有WebBrowser 控件的exe 中的方法中使用。例如:

      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));
      

      不幸的是,类库必须注册,您会从 IE 收到 ActiveX 警告

      第二种解决方案是不创建类库,而不是将这些类型留在应用程序 exe 中。如果我们想将对象从 javascript 传递到 C#,我们仍然需要接口 IFoo。我们需要在 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 互操作注册任何内容,并且 IE 将没有 ActiveX 警告

      【讨论】:

        猜你喜欢
        • 2011-11-08
        • 1970-01-01
        • 2018-09-13
        • 1970-01-01
        • 2013-02-11
        • 2012-01-27
        • 1970-01-01
        • 2019-05-19
        • 1970-01-01
        相关资源
        最近更新 更多