精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

在 .NET 應用程序中運行 JavaScript,你會了嗎?

開發 前端
在這篇文章中,我展示了如何使用 JavaScriptEngineSwitcher NuGet 包來在 .NET 應用程序中運行 JavaScript。這個包為許多不同的 JavaScript 引擎提供了一個一致的接口。

前幾天我在做一個副業,意識到我需要使用一些 JavaScript 功能。一想到要再次處理 Node.js 和 npm,我就完全放棄了,所以我決定研究一下在 .NET 應用程序中運行 JavaScript 的可能性。很瘋狂吧?實際上,這出乎意料的簡單。

1.你為什么要這樣做?

盡管我很喜歡 .NET 生態系統,但有些事情,JavaScript 生態系統做得更好。其中之一就是任何事情都能找到一個庫,特別是涉及到網絡時。

以語法高亮為例。這可以直接用 C# 來做,但這不是一個特別流暢的體驗。例如,TextMateSharp 項目為 TextMate 語法提供了一個解釋器。這些文件是 VS Code 用來為一種語言添加基本語法高亮的。然而,如果你想部署應用程序,它包裝了一個本地依賴,這就增加了一些復雜性。

相比之下,JavaScript 有大量成熟的語法高亮庫。僅舉幾例,有 highlight.js、Prism.js(在本博客中使用)和 shiki.js。尤其是前兩個,非常成熟,有多個插件和主題,而且有簡單的 API。

作為一個 .NET 開發者,JavaScript 的明顯問題是,你需要學習并選擇進入一個完整的獨立工具鏈,與 Node.js 和 NPM 一起工作。這似乎是一個很大的開銷,只是為了使用一個小功能。

因此,我們陷入了一個困境。我們要么走 C#(+ Native)路線,要么就得轉用 JavaScript。

或者......我們直接從我們的 .NET 應用程序中調用 JavaScript 。

2.在 .NET 中運行 JavaScript

一旦你決定在你的 .NET 代碼中運行 JavaScript,你就會考慮幾個選擇。你可以借用 JavaScript 引擎,讓它為你運行你的 JavaScript,但你并沒有真正解決問題,你仍然需要安裝 Node.js。

另一個選擇是在你的庫中直接捆綁 JavaScript 引擎。這并不像聽起來那么瘋狂,有幾個 NuGet 包采用了這種方法,然后暴露出一個 C# 層來與引擎進行交互。

下面是你可以使用的一些包的列表。

Jering.Javascript.NodeJS

這個庫采取了上述的第一種方法。它不包括包中的 Node.js。相反,它為執行 JavaScript 代碼提供了一個 C# API,并調用了安裝在你機器上的 Node.js。這在你知道兩者都已安裝的環境中可能很有用,但它并沒有真正解決我想避免的問題。

ChakraCore

ChakraCore 是 Edge 轉為基于 Chromium 引擎之前最初使用的 JavaScript 引擎。根據 GitHub 項目的介紹:

ChakraCore 是一個帶有 C 語言 API 的 JavaScript 引擎,你可以用它來為任何 C 語言或 C 語言兼容項目添加對 JavaScript 的支持。它可以在 Linux macOS 和 Windows 上針對 x64 處理器進行編譯。而 x86 和 ARM 只適用于 Windows。

因此,ChakraCore 包括一個本地依賴,但由于 C# 可以 P/Invoke 到本地庫,這本身并不是一個問題。但它會帶來一些部署方面的挑戰。

ClearScript (V8)

Node.JS、Chromium、Chrome 和最新的 Edge 使用的都是 V8 JavaScript 引擎。Microsoft.ClearScript 包為該庫提供了一個封裝,為調用 V8 庫提供了一個 C# 接口。就像 ChakraCore 一樣,V8 引擎本身是一個本地依賴。ClearScript 庫負責 P/Invoke 調用,提供了一個很好的 C# API,但你仍然要確保你在目標平臺上部署了正確的本地庫。

Jint

Jint 很有意思,因為它是一個完全在 .NET 中運行的 JavaScript 解釋器,沒有任何本地的依賴!它完全支持 ECMAScript 5.1 (ES5),并支持 .NET Standard 2.0,所以你可以在你的所有項目中使用它!

Jurassic

Jurassic 是另一個 JavaScript 引擎的 .NET 實現,類似于 Jint。也和 Jint 類似,它支持所有的 ES5,而且似乎也部分支持 ES6。與 Jint 不同的是,Jurassic 不是一個解釋器,它將 JavaScript 編譯成 IL,這使得它的速度非常快,而且它沒有本地的依賴性。

那么,在所有這些選擇中,你應該選擇哪一個?

3.JavaScriptEngineSwitcher:當一個 JS 引擎不夠用的時候

還有一個偉大的項目可以讓你簡單地嘗試上面其中的任何一個庫。雖然所有的庫都允許你運行 JavaScript,但它們都有略微不同的 C# API 來與之交互。這可能會使比較它們變得有點痛苦,因為你必須為每個庫學習不同的 API。

JavaScriptEngineSwitcher 這個庫為我提到的所有庫和更多的庫提供了封裝:

  • Jering.Javascript.NodeJS
  • ChakraCore
  • Microsoft ClearScript.V8
  • Jint
  • Jurassic
  • MSIE JavaScript Engine for .NET
  • NiL.JS
  • VroomJs

每個庫都在一個單獨的包中(有本地依賴關系的引擎需要一個額外的本地包),還有一個 Core 包,它提供通用的 API。即使你不打算切換 JS 引擎,我也傾向于盡可能地使用 JavaScriptEngineSwitcher 封裝庫,這樣你就不必在以后需要切換引擎時弄清楚一個新的 API 了。

在 .NET 項目中改變使用的 JavaScript 引擎在我看來是完全可能的。例如,我開始使用 Jint,但當我需要執行更大的腳本時,我遇到了性能問題,于是換成了 Jurassic。JavaScriptEngineSwitcher 讓這一切變得很簡單,只需在我的項目中添加一個新的包并改變一些初始化代碼即可。

我最近才發現 JavaScriptEngineSwitcher 這個庫,但最新版本的下載量已接近一百萬,它被用于 .NET 靜態網站建設者 Statiq 中。在這篇文章的最后部分,我將舉一個最基本用法的例子。

4.案例:用 JavaScriptEngineSwitcher 在控制臺應用中運行 prism.js

在這篇文章的開頭,我討論了一個特定的場景--代碼塊的語法高亮。在本節中,我將展示如何使用 prism.js 高亮一小段代碼,并在一個控制臺應用程序中運行。

開始之前請添加 JavaScriptEngineSwitcher.Jurassic NuGet 包的引用。

dotnet add package JavaScriptEngineSwitcher.Jurassic

接下來,下載你想運行的 JavaScript 文件。例如,我從 Prism.js 的官網下載了 prism.js 文件,并將 C# 添加到默認支持高亮的語言集。在把文件放到項目文件夾的根目錄后,我把文件更新為嵌入資源。你可以在你的 IDE 中操作,也可以手動編輯項目文件:

<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="JavaScriptEngineSwitcher.Jurassic" Version="3.17.4" />
</ItemGroup>

<!-- ?? Make prism.js an embedded resource -->
<ItemGroup>
<None Remove="prism.js" />
<EmbeddedResource Include="prism.js" />
</ItemGroup>

</Project>

剩下的就是編寫代碼,在我們的程序中運行腳本。下面的代碼段設置了 JavaScript 引擎,從程序集中加載嵌入的 prism.js 庫,并執行它。

using JavaScriptEngineSwitcher.Jurassic;

// Create an instance of the JavaScript engine
IJsEngine engine = new JurassicJsEngine();

// Execute the embedded resource called JsInDotnet.prism.js from the provided assembly
engine.ExecuteResource("JsInDotnet.prism.js", typeof(Program).Assembly);

現在我們可以在同一個上下文中運行我們自己的 JavaScript 命令。我們可以通過使用 SetVariableName、Execute 和 Evaluate 從 C# 向 JavaScript 引擎傳遞數值:

// This is the code we want to highlight
string code = @"
using System;

public class Test : ITest
{
public int ID { get; set; }
public string Name { get; set; }
}";

// set the JavaScript variable called "input" to the value of the c# variable "code"
engine.SetVariableValue("input", code);

// set the JavaScript variable called "lang" to the string "csharp"
engine.SetVariableValue("lang", "csharp");

// run the Prism.highlight() function, and set the result to the "highlighed" variable
engine.Execute($"highlighted = Prism.highlight(input, Prism.languages.csharp, lang)");

// "extract the value of "highlighted" from JavaScript to C#
string result = engine.Evaluate<string>("highlighted");

Console.WriteLine(result);

當你把它們放在一起運行時,高亮的代碼會被打印到控制臺:

<span class="token keyword">using</span> <span class="token namespace">System</span><span class="token punctuation">;</span>

<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Test</span> <span class="token punctuation">:</span> <span class="token type-list"><span class="token class-name">ITest</span></span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token return-type class-name"><span class="token keyword">int</span></span> ID <span class="token punctuation">{</span> <span class="token keyword">get</span><span class="token punctuation">;</span> <span class="token keyword">set</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token return-type class-name"><span class="token keyword">string</span></span> Name <span class="token punctuation">{</span> <span class="token keyword">get</span><span class="token punctuation">;</span> <span class="token keyword">set</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

渲染后,看起來像這樣:

我對整個過程的簡單程度感到驚訝。啟動一個 JavaScript 引擎,加載 prism.js 文件,并執行我們的自定義代碼是如此順利。這是我面臨問題的完美解決方案。

我顯然不建議所有的應用程序都這樣做。如果你需要運行大量的 JavaScript,那么直接使用 Node.js 生態系統及工具可能更容易。但如果你只是想利用一個小型的、獨立的工具(如 prims.js),那么這是一個不錯的選擇。

5.總結

在這篇文章中,我展示了如何使用 JavaScriptEngineSwitcher NuGet 包來在 .NET 應用程序中運行 JavaScript。這個包為許多不同的 JavaScript 引擎提供了一個一致的接口。其中一些引擎(如 Chakra Core 和 V8)需依賴一個本地組件,而其他引擎(如 Jint 和 Jurassic)只使用托管代碼。最后,我展示了你如何使用 JavaScriptEngineSwitcher 在 .NET 應用程序內部運行 Prims.js 代碼高亮庫。

原文:bit.ly/38awq7W

作者:Andrew Lock

翻譯:精致碼農

責任編輯:武曉燕 來源: 精致碼農
相關推薦

2025-01-14 08:32:55

JWT令牌.NET

2024-08-07 08:40:46

2025-01-26 15:31:27

2024-10-09 07:40:43

2021-05-06 05:37:40

JavascriptSTT機器學習

2023-11-26 00:34:36

Javascript應用方法

2023-06-26 00:01:11

2024-11-28 10:09:06

2025-01-09 07:50:34

.NET 9ScalarSwagger

2024-12-05 08:31:10

2024-07-11 08:29:57

大數據.NET工具

2023-07-27 07:29:44

.NetMSIL工具

2024-09-06 07:29:05

2024-10-16 11:28:42

2024-09-04 08:40:51

2022-03-11 14:59:21

JavaScript數組字符串

2021-03-09 11:09:10

LinuxWindows應用程序

2009-10-29 13:16:15

ADO.NET應用程序

2011-10-12 11:24:44

AndroidPC

2024-09-10 10:34:48

點贊
收藏

51CTO技術棧公眾號

欧美年轻男男videosbes| 91捆绑美女网站| 欧美激情中文字幕乱码免费| 亚洲久久久久久| 网友自拍亚洲| 亚洲久草在线视频| 久久亚洲高清| 国产欧美久久久| 欧美亚洲在线| 欧美xxxx18性欧美| 欧美大波大乳巨大乳| 精品一区二区三区中文字幕| 狠狠色狠狠色综合日日五| 亚洲国产激情一区二区三区| 亚洲精品成人电影| 轻轻草成人在线| 久久久久久12| 久久精品色妇熟妇丰满人妻| 久久av国产紧身裤| 91精品综合久久久久久| 日韩亚洲在线视频| wwwww亚洲| |精品福利一区二区三区| 久久草.com| 成 人 黄 色 片 在线播放| 天堂蜜桃91精品| 午夜精品理论片| 中文字幕av免费在线观看| 国产一区二区三区电影在线观看| 精品国产区一区| 色综合五月婷婷| 制服诱惑亚洲| 欧美性xxxxx极品| www.射射射| 午夜成年人在线免费视频| 国产精品女上位| 欧美一卡2卡3卡4卡无卡免费观看水多多| av男人天堂av| 韩国成人在线视频| 国产欧洲精品视频| 中文字幕视频一区二区| 老牛国产精品一区的观看方式| 高清一区二区三区四区五区| www.5588.com毛片| 久久中文字幕av一区二区不卡| 亚洲精品一区二区网址| 亚洲精品乱码久久久久久久| 亚洲超碰在线观看| 日韩视频免费观看高清完整版在线观看 | 亚洲欧洲日本一区二区三区| 欧美高跟鞋交xxxxxhd| 国产精品国产精品88| 99久久.com| 最近2019中文字幕mv免费看 | 97视频在线观看亚洲| 久久免费黄色网址| 亚洲人成高清| 51午夜精品视频| 久草手机在线视频| 丝袜美腿亚洲一区| 国产精品三级久久久久久电影| 男人天堂视频在线| 奇米色777欧美一区二区| 国产精品久久久久国产a级| 在线观看国产小视频| 美女视频网站黄色亚洲| 成人黄色中文字幕| 成人毛片在线免费观看| av欧美精品.com| 欧美日韩最好看的视频| a天堂在线资源| 最新不卡av在线| 97碰在线视频| 涩涩视频在线免费看| 色婷婷综合久久久中文一区二区| 久草综合在线观看| 欧美成人三级| 日韩久久精品一区| 加勒比精品视频| 欧美亚洲国产精品久久| 久久视频在线直播| 国产网站在线看| 久久综合婷婷| 96国产粉嫩美女| 婷婷在线免费观看| 国产女同性恋一区二区| 男人j进女人j| 中文一区一区三区高中清不卡免费| 色欧美片视频在线观看| 北条麻妃亚洲一区| 杨幂一区二区三区免费看视频| 一区二区在线视频播放| 欧美日韩中文字幕在线观看| 在线综合欧美| 成人激情av在线| 欧美在线一卡| 亚洲精品乱码久久久久久| 欧美二区在线视频| 精品中文字幕一区二区三区四区| 亚洲精品国精品久久99热一| 四虎影视1304t| 日韩一级欧洲| 亚洲a在线观看| 麻豆导航在线观看| 亚洲一区二区三区国产| av网站在线不卡| 国产精品宾馆| 久久视频在线视频| 久久久久久无码精品大片| 高清成人免费视频| 一区二区日本| 欧美成人h版| 精品欧美一区二区在线观看| 妖精视频在线观看免费 | 久久久久久久久国产| 亚洲视屏在线观看| 91视频在线观看免费| 精品无码av无码免费专区| 影音成人av| 国产视频精品久久久| 久久久久人妻一区精品色欧美| 奇米777欧美一区二区| 久久精品第九区免费观看| 在线观看的网站你懂的| 欧美日本一道本| www久久久久久久| 免播放器亚洲| 久久久国产精品一区二区三区| 羞羞视频在线观看免费| 欧美精品在线一区二区| 日韩av片在线| 日韩成人午夜精品| 欧美视频观看一区| 在线播放高清视频www| 亚洲白虎美女被爆操| 日本黄色片免费观看| 麻豆精品新av中文字幕| 日本欧美精品久久久| 涩涩网在线视频| 日韩成人中文字幕| 日本一二三区视频| 不卡一二三区首页| www插插插无码视频网站| 91欧美极品| 欧美精品电影免费在线观看| www.蜜臀av| 亚洲宅男天堂在线观看无病毒| 日本高清免费在线视频| 中文无码久久精品| 亚洲永久在线观看| 影院在线观看全集免费观看| 日韩一区二区三区电影| 欧美精品xxxxx| 高清国产一区二区| 18岁网站在线观看| 免费短视频成人日韩| 日本乱人伦a精品| 国产爆初菊在线观看免费视频网站| 日本丶国产丶欧美色综合| 欧美大波大乳巨大乳| 蜜臀av一区二区| 四虎影院一区二区| 在线观看视频一区二区三区| 国模私拍一区二区三区| 偷拍自拍在线| 欧美在线观看视频一区二区三区| 午夜黄色福利视频| 国产一区二区在线影院| 2019日韩中文字幕mv| 午夜精品影视国产一区在线麻豆| 国产91精品网站| 麻豆网在线观看| 亚洲精品一区在线观看| 欧美一二三区视频| 欧美国产日韩亚洲一区| 超碰在线免费av| 在线欧美不卡| 日韩伦理一区二区三区av在线| 9999精品视频| 97色在线观看| 三区四区在线视频| 精品国产免费人成在线观看| 日日噜噜噜噜人人爽亚洲精品| 国产精品久久久久国产精品日日| www.偷拍.com| 久久亚洲风情| 麻豆传媒网站在线观看| 首页亚洲中字| 亚洲一区二区久久久久久| а√天堂中文在线资源8| 在线电影中文日韩| 成人免费公开视频| 欧美日韩视频在线第一区| 伊人365影院| 中文乱码免费一区二区| www男人天堂| 免费在线欧美视频| 国产视频九色蝌蚪| 亚洲精品午夜av福利久久蜜桃| 精品国产乱码久久久久久蜜柚| 欧美最新精品| 久久久欧美一区二区| 888av在线| 日韩成人在线网站| 丰满肉嫩西川结衣av| 欧美色图在线观看| 四虎精品永久在线| 亚洲一区二区三区四区五区黄| 欧美巨胸大乳hitomi| 99久久精品99国产精品| 日韩高清在线一区二区| 日韩avvvv在线播放| 亚洲 欧美 日韩 国产综合 在线| 91久久国产| 日韩欧美精品一区二区三区经典| 成人知道污网站| 成人激情视频在线| 中文.日本.精品| 欧美亚洲成人免费| 久草在线视频资源| 久久久精品免费| 91欧美在线视频| 亚洲欧美在线磁力| 婷婷久久久久久| 亚洲第一av网站| av网站免费大全| 在线不卡一区二区| 在线观看中文字幕2021| 日本高清不卡在线观看| 在线观看日韩中文字幕| 亚洲18女电影在线观看| 久久久久久久久久久久国产| 综合亚洲深深色噜噜狠狠网站| 免费看黄色三级| 国产午夜精品一区二区| 国产成人av一区二区三区不卡| 波多野结衣一区二区三区| 18禁一区二区三区| 国产精品18久久久| 国产精品99久久久精品无码| 国产麻豆精品久久一二三| 日本高清一区二区视频| 久久国产福利国产秒拍| 邪恶网站在线观看| 久久激情综合网| 亚洲18在线看污www麻豆| 狠狠色综合日日| 下面一进一出好爽视频| 国产精品888| 中文字幕无人区二| 国产成人免费视| 极品白嫩的小少妇| 不卡视频一二三| 日本丰满少妇裸体自慰| 26uuu久久天堂性欧美| 久久久久久国产精品无码| 久久久久久久久岛国免费| 无码人妻aⅴ一区二区三区69岛| 国产日韩欧美精品电影三级在线| 日韩不卡av在线| 国产精品国产自产拍在线| 中文字幕在线观看2018| 依依成人综合视频| 亚洲一区 视频| 色综合网站在线| 91av国产精品| 精品噜噜噜噜久久久久久久久试看 | 亚洲一级理论片| 亚洲精品视频观看| 日韩免费视频网站| 91久久精品一区二区| 国产在成人精品线拍偷自揄拍| 欧美一区二区免费观在线| 黄色美女一级片| 亚洲区在线播放| 黄色网页网址在线免费| 国自在线精品视频| 四虎4545www精品视频| 亚洲综合精品伊人久久| 久久人人爽人人爽人人片av不| 欧美日韩一区在线播放| 日韩中文在线电影| 丰满的少妇愉情hd高清果冻传媒| 久久午夜电影| 在线观看日本www| 99久久伊人精品| 三级黄色免费观看| 五月综合激情日本mⅴ| 中文字幕在线观看免费| 日韩欧美123| www黄在线观看| 久久久亚洲网站| 久久69成人| 久久精品人成| 亚洲欧美文学| 日本熟妇人妻xxxxx| 国产乱码精品一区二区三区忘忧草 | www.黄色av| 中文字幕国产精品| 国产精选在线| 亚洲bt天天射| 日韩1区在线| 久久亚洲中文字幕无码| 精品在线播放午夜| 亚洲久久久久久久| 亚洲国产wwwccc36天堂| 亚洲天堂中文在线| 亚洲欧美日韩成人| 99在线视频影院| 91视频九色网站| 国产一区二区三区四区大秀| www.av毛片| 国产精品主播直播| 久久久久亚洲AV成人无在| 五月天中文字幕一区二区| 国产绿帽刺激高潮对白| 有码中文亚洲精品| 在线看片国产福利你懂的| 高清视频一区二区三区| 亚洲h色精品| 中文字幕 91| 久久久久久久久久久黄色| 日韩成人免费在线观看| 日韩美一区二区三区| 久久bbxx| 成人免费视频网址| 日韩av自拍| 国产视频手机在线播放| 国产视频一区二区在线观看| 国产香蕉视频在线| 亚洲精品国产福利| 三级中文字幕在线观看| 国产一区二区精品免费| 韩国av一区| 特级特黄刘亦菲aaa级| 一区二区高清视频在线观看| 国产精品一二三四五区| 久久精品电影网站| 亚洲国产aⅴ精品一区二区三区| 亚洲不卡一卡2卡三卡4卡5卡精品| 亚洲二区免费| 欧美精品欧美极品欧美激情| 午夜视频在线观看一区二区 | 9l国产精品久久久久麻豆| 免费在线黄色片| 精品国产免费人成电影在线观看四季| aaa大片在线观看| 99久久精品无码一区二区毛片 | 欧美xxxx黑人| 一区二区三区精品视频| 黄色aaa毛片| 2018国产精品视频| 国产精品日韩精品中文字幕| 成年人小视频网站| 国产精品美女久久久久久久 | 国产一区久久久| 久久免费公开视频| 日韩精品视频在线播放| 亚洲www.| 国产精品久久成人免费观看| 国产精品一区久久久久| 麻豆亚洲av熟女国产一区二| 亚洲第一福利网| 欧美大片免费| 亚洲一区二区精品在线| 国产精品亚洲а∨天堂免在线| 国产真实乱人偷精品视频| 精品亚洲永久免费精品| 成人影院在线免费观看| 国产奶头好大揉着好爽视频| 国产精品资源站在线| 日韩美女黄色片| 中国人与牲禽动交精品| 欧美日本三级| 欧美视频第一区| 亚洲欧洲韩国日本视频| 亚洲美女性生活| 国产精品27p| 欧美日韩久久| 亚洲精品国产一区黑色丝袜| 欧美人妇做爰xxxⅹ性高电影| 亚洲羞羞网站| 区一区二区三区中文字幕| 精品亚洲aⅴ乱码一区二区三区| www.youjizz.com亚洲| 伊人亚洲福利一区二区三区| 日韩中文字幕在线一区| 欧美a在线视频| 亚洲色大成网站www久久九九| 熟妇高潮一区二区三区| 国产精品视频yy9099| 亚洲精品社区| 日本 欧美 国产| 日韩成人在线视频观看| 国产电影一区| 成人综合视频在线| 亚洲精品视频一区| 日p在线观看| 久久久影院一区二区三区| 国产在线不卡一区|