上下文:Azure, c#, ClearScript, JavaScript, HtmlAgilityPack, HtmlAgilityPack。CssSelectors
我经常这样做:使用ClearScript在c#应用程序中添加脚本。通常这是可行的。...
using Microsoft.ClearScript;
using Microsoft.ClearScript.Windows;
...
class Program
{
static JScriptEngine JSengine = null;
...
JSengine = new JScriptEngine(WindowsScriptEngineFlags.EnableDebugging | WindowsScriptEngineFlags.EnableJITDebugging);
....
JSengine.AddHostType("CSHtmlDocument", typeof(HtmlAgilityPack.HtmlDocument));
...
之后,在JavaScript代码中,还有
...
var hap = new CSHtmlDocument();
hap.LoadHtml(html);
...
在我加入HtmlAgilityPack.CssSelectors
之前,一切都很顺利。在c#方面,这为HtmlDocument
对象增加了额外的方法,特别是QuerySelector
和QuerySelectorAll
。它们在c#端是可见的。然而,在JavaScript端,它们不是,像
...
var selection = hap.QuerySelector(".reduced");
...
抛出一个错误,并且在Visual Studio 2015的调试会话中查看对象,发现hap var中没有QuerySelector
方法。
到底是怎么回事?这是一个ClearScript问题还是c#问题?我该怎么做呢?我很高兴编写一个包装器类,我只是希望一切都像以前一样工作。
这些新方法很可能是由特定类定义的扩展方法。为了使它们可以从脚本代码访问,您必须将该类公开给脚本引擎。
编辑:我不熟悉他们,但看起来你正在谈论的方法是由HapCssExtensionMethods
类(或非常类似的东西)提供的。要公开方法,只需公开类:
// C#
JSengine.AddHostType(typeof(HapCssExtensionMethods));
一旦完成了这些,上面的JavaScript示例应该可以正常工作。