如何使用Awesomium将JavaScript结果返回给C#?

时间:2011-11-11 05:04:08

标签: c# awesomium

我创建了一个新的WPF项目,并为其添加了Awesomium 1.6.3 WebControl

然后,我将此代码添加到MainWindow.xaml.cs

    private void webControl1_Loaded(object sender, RoutedEventArgs e)
    {
        webControl1.LoadURL("https://www.google.com/");
    }

    private void webControl1_DomReady(object sender, EventArgs e)
    {
        var wc = new WebClient();
        webControl1.ExecuteJavascript(jQuery);
        webControl1.ExecuteJavascript(@"var __jq = jQuery.noConflict();");
        webControl1.ExecuteJavascript(@"alert(__jq);");
        using(var result = webControl1.ExecuteJavascriptWithResult(@"(function() { return 1; })();"))
        {
            MessageBox.Show(result.ToString());
        }
        //using (var result = webControl1.ExecuteJavascriptWithResult(@"(function() { return __jq('a'); })();"))
        //{
        //    MessageBox.Show(result.ToString());
        //}
    }

它警告“1”,然后是“功能(a,b){...}”,这是不正常的,现在我想到了它,但无论如何,这是另一个问题。

一旦取消注释底部代码,它就会发出“1”警告然后挂起。为什么?我怎样才能获得有关页面链接的一些信息?或者可靠地将一些信息传递回C#?或者使用C#访问DOM?

编辑: jQuery只是一个包含jQuery 1.7代码的字符串。

2 个答案:

答案 0 :(得分:5)

关于为什么以下行挂起:

webControl1.ExecuteJavascriptWithResult(@"(function() { return __jq('a'); })();")

这是因为ExecuteJavascriptWithResult只能返回基本的Javascript类型(String,Number,Boolean,Array或用户创建的Object)。您尝试返回无法映射到其中一种类型的本机DOM元素对象,因此请求失败。

答案 1 :(得分:1)

返回复杂对象的简单方法是使用JSON.stringify()转换为字符串,然后在C#托管代码中解析。

例如:

JSValue rawToken = browser.ExecuteJavascriptWithResult(@"JSON.stringify(someTokenObjectHere);");
if (rawToken.IsString)
{
    // For generic objects:
    JObject payload = JObject.Parse(rawToken.ToString());
    // For typed objects:
    MyCustomTokenObject payload = JsonConvert.DeserializeObject<MyCustomTokenObject>(rawToken.ToString());
}

(为序列化内容包含Newtonsoft.Json可能更有利。)