代码之家  ›  专栏  ›  技术社区  ›  santosh singh

使用c#4.0动态特性从c#调用javascript

  •  1
  • santosh singh  · 技术社区  · 14 年前

    有可能从c#调用javascript吗?

    ScriptRuntime py = Python.CreateRuntime();
    dynamic random = py.UseFile("cal.js");
    var result =random.Add(1,2);
    

    卡尔·js


     function Add(a, b) {
    
            return (a + b);
        }
    
    2 回复  |  直到 14 年前
        1
  •  2
  •   Fraser    12 年前

    是的,只要您在webrowser控件中托管js。您可以将ObjectForScripting和document属性与com可见对象一起使用。事实上,恰恰相反,也就是说,您可以从JavaScript调用c#方法。类型dynamic允许您传递和使用复杂对象,而不必使用反射Invoke/GetProperty等。

    这里有一个非常简单的例子。

    [ComVisibleAttribute(true)]
    public class Ofs
    {
       public void MethodA(string msg)
       {
          MessageBox.Show(msg); // hello from js!
       }
    }
    
    public class Form1
    {
    
      void Form1()
      {
        WebBrowser b = new WebBrowser();
        b.DocumentText = "<script>"
          + "var a = [];"
          + "a.foo = 'bar!'";
          + "var jsFunc=function(y){alert(y);}"
          + "var jsFunc2=function(){return a;}"
          + "window.external.MethodA('hello from js!');</script>";
    
        b.ObjectForScripting = new Ofs(); // we can call any public method in Ofs from js now...
        b.Document.InvokeScript("jsFunc", new string[] { "hello!" }); // we can call the js function
        dynamic a = (dynamic)b.Document.InvokeScript("jsFunc2"); // c#'a' is js'a'
        string x = a.foo;
        MessageBox.Show(x); // bar!
      }
    }
    
        2
  •  0
  •   Tim Lloyd    14 年前

    是的,可以从C#调用Javascript代码,但不能使用动态类型。

    相反,您可以利用JScript.Net的eval功能来实现这一点。

    以下文章介绍了执行此操作的基础知识:

    http://odetocode.com/Code/80.aspx