如何将 HtmlAgilityPack.CssSelectors 公开到 ClearScript

How to expose HtmlAgilityPack.CssSelectors into ClearScript

上下文: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 对象添加了额外的方法,特别是 QuerySelectorQuerySelectorAll。它们在 C# 端可见。但是,在 JavaScript 方面他们不是,代码如

...
var selection = hap.QuerySelector(".reduced");
...

抛出错误并从 Visual Studio 2015 年的调试会话中查看对象显示 hap var 中没有 QuerySelector 方法。

这是怎么回事?是 ClearScript 问题还是 C# 问题?我该怎么办?我很高兴写一个包装器 class,我只是希望一切都像以前一样工作。

这些新方法很可能是 extension methods 由特定 class 定义的。要使脚本代码可以访问它们,您必须将 class 公开给脚本引擎。

编辑:我不熟悉它们,但看起来您所说的方法是由 HapCssExtensionMethods class(或非常相似的东西)提供的。要公开这些方法,只需公开 class:

// C#
JSengine.AddHostType(typeof(HapCssExtensionMethods));

完成后,上面的 JavaScript 示例应该可以正常工作。