如何暴露htmllagilitypack.CssSelectors到ClearScript中

本文关键字:CssSelectors ClearScript htmllagilitypack 何暴露 暴露 | 更新日期: 2023-09-27 18:11:47

上下文: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#问题?我该怎么做呢?我很高兴编写一个包装器类,我只是希望一切都像以前一样工作。

如何暴露htmllagilitypack.CssSelectors到ClearScript中

这些新方法很可能是由特定类定义的扩展方法。为了使它们可以从脚本代码访问,您必须将该类公开给脚本引擎。

编辑:我不熟悉他们,但看起来你正在谈论的方法是由HapCssExtensionMethods类(或非常类似的东西)提供的。要公开方法,只需公开类:

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

一旦完成了这些,上面的JavaScript示例应该可以正常工作。