访问由c#浏览器控件中运行的java脚本返回的对象

本文关键字:java 脚本 返回 对象 运行 浏览器 控件 访问 | 更新日期: 2023-09-27 18:12:21

我想知道我如何访问一个javascript函数返回的对象的属性从c#内的浏览器控件内运行。

下面是完整的上下文:

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

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

在我的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"answers"lat"?

提前感谢,任何帮助都是感激的。

访问由c#浏览器控件中运行的java脚本返回的对象

尝试使用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);

我之前没有在这个场景中检查这段代码,所以您可能需要使用绑定标志。