【问题标题】:Accessing objects returned by java script running in a webbrowser control from C#从 C# 访问在 webbrowser 控件中运行的 java 脚本返回的对象
【发布时间】:2011-12-14 12:07:29
【问题描述】:

我想知道如何从 C# 中访问在 webbrowser 控件中运行的 javascript 函数返回的对象的属性。

这是完整的上下文:

我想创建一个基于 OpenStreetMap 的开放层 JavaScript 库的 C# 映射控件。 OSM 地图显示在 webbrowser 元素内显示的网页中。我正在使用 InvokeScript 来通过为开放图层库调用简化的 java 脚本包装器来控制地图。一切正常。

在 C# 包装器中,我想实现一个函数,返回当前在 webbrowser 控件中显示的地图的中心坐标。到目前为止,我只提出了一个非常不雅的解决方案:

在我的 C# 包装器中,我需要两个函数来查询地图中心。首先,我有一个名为 GetCenter 的函数,它使用 InvokeScript 调用一个 JavaScript 函数,该函数又调用另一个 C# 函数 (SetCenterFromJScript) 在我的 C# 包装器中设置地图中心:

public Coord GetCenter()
{
  object center = webBrowser.Document.InvokeScript("set_center_in_wrapper");

  // I'm stuck here:
  Type type = center.GetType();
  PropertyInfo[] pi = type.GetProperties();

  // I already get the center as an object, but how can i access the
  // properties "lon" and "lat" directly so that i can get rid of m_center 
  // and SetCenterFromJScript alltogether?

  return m_center;
}

public void SetCenterFromJScript(double lon, double lat)
{
  m_center.lon = lon;
  m_center.lat = lat;
}

Java 脚本函数通过 ObjectForScripting 机制调用 C#,如下所示:

function set_center_in_wrapper()
{
  var center = map.getCenter().transform(new OpenLayers.Projection("EPSG:900913"), 
                                         new OpenLayers.Projection("EPSG:4326"))

  window.external.SetCenterFromJScript(center.lon, center.lat);
  return center // <- useless at the moment since i don't know how to access the data from C#
}

目前返回值没用,我正在使用 SetCenterFromJScript 提交坐标。如何直接从 C# 访问中心的属性“lon”和“lat”?

在此先感谢,如果有任何帮助,我们将不胜感激。

【问题讨论】:

    标签: c# javascript webbrowser-control openlayers openstreetmap


    【解决方案1】:

    尝试使用InvokeMember 获取中心的属性。比如:

     object center = webBrowser.Document.InvokeScript("set_center_in_wrapper");
     Type type = center.GetType();
     Int32 lon = (Int32) type.InvokeMember("lon", 
                BindingFlags.DeclaredOnly | 
                BindingFlags.Public | BindingFlags.NonPublic | 
                BindingFlags.Instance | BindingFlags.GetField, null, center, null);
     Int32 lat = (Int32) type.InvokeMember("lat", 
                BindingFlags.DeclaredOnly | 
                BindingFlags.Public | BindingFlags.NonPublic | 
                BindingFlags.Instance | BindingFlags.GetField, null, center, null);
    

    我之前没有在这种情况下检查此代码,因此您可能需要使用绑定标志来玩弄。

    【讨论】:

    • 非常感谢!这适用于较小的修改:在我的情况下类型是双重的,我必须使用 BindingFlags.GetProperty 而不是 BindingFlag.GetField。
    猜你喜欢
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 2012-09-11
    • 2012-10-26
    • 2014-02-18
    • 1970-01-01
    相关资源
    最近更新 更多