如何在JavaScript中運行.NET?Core代碼詳情
一、前言
在.NET Core中運行JavaScript代碼,目前已經(jīng)有很多實現(xiàn)方案。
但是,如果你希望在純JavaScript環(huán)境中運行.NET Core代碼呢?
那么,DotNetJS可能對你有所幫助。
二、DotNetJS
DotNetJS可以將C#項目編譯為與任何環(huán)境兼容的單文件JavaScript庫,無論是Web瀏覽器,Node.js還是自定義限制空間,如VS Code的Web擴展,都可以正常使用它。
該解決方案基于兩個主要組件:
- JavaScript/dotnet-runtime(npm)使用已編譯的C#程序集和.NET運行時WebAssembly模塊,以在JavaScript中提供C# 操作性層。該庫與環(huán)境無關(guān) - 它不依賴于特定于平臺的API,如瀏覽器DOM或節(jié)點模塊,并且可以作為CommonJS或ECMAScript模塊導(dǎo)入,也可以通過瀏覽器中的腳本標(biāo)記使用。
- DotNet/dotNetJS(NuGet)在C#中提供JavaScript互操作性層,并通過MSBuild任務(wù)將項目輸出打包到單文件JavaScript庫中。生成的庫包含使用項目程序集初始化的dotnet運行時,并準備用作打包的C#項目的互操作性層。
三、Demo
1. 創(chuàng)建項目
使用VS2022創(chuàng)建一個控制臺項目,修改項目文件,文件內(nèi)容如下:
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <EmitSourceMap>true</EmitSourceMap> <EmitTypes>true</EmitTypes> </PropertyGroup> <ItemGroup> <PackageReference Include="DotNetJS" Version="0.4.0" /> </ItemGroup> </Project>
- 指定SDK為
Microsoft.NET.Sdk.BlazorWebAssembly
- 引用
DotNetJS Nuget
包
2. 實現(xiàn)C#代碼
實現(xiàn)Program.cs,代碼如下:
using DotNetJS; using Microsoft.JSInterop; using System; using System.Threading.Tasks; namespace HelloDotnetJS; public partial class Program { public static void Main() { Console.WriteLine($"HelloDotnetJS 初始化!"); } [JSFunction] public static partial string GetBaseAddress(); [JSInvokable] public async static Task<WeatherForecast[]> Demo() { var uri = new Uri(GetBaseAddress()); Console.WriteLine(uri); var json = await new System.Net.Http.HttpClient { BaseAddress = uri } .GetStringAsync("weather.json"); var forecasts = Newtonsoft.Json.JsonConvert.DeserializeObject<WeatherForecast[]>(json); return forecasts; } }
Demo方法的具體邏輯如下:
- 獲取網(wǎng)站根路徑,使用[JSFunction]指定具體值來源于JS傳入;
- 訪問網(wǎng)站根路徑下的
weather.json
文件 - 反序列化json,調(diào)用Newtonsoft驗證第三方庫能否正常使用;
- 返回
WeatherForecast
集合
在終端窗口執(zhí)行??dotnet publish?
??,上述代碼將會編譯成JS代碼文件??dotnet.js?
?。
3. 實現(xiàn)JS代碼
創(chuàng)建demo.html,代碼如下:
<meta charset="UTF-8"> <script src="dotnet.js"></script> <script> //定義GetBaseAddress實現(xiàn) dotnet.HelloDotnetJS.GetBaseAddress = () => window.location.protocol + "http://" + window.location.host; window.onload = async function () { //初始化 await dotnet.boot(); console.log("開始執(zhí)行Demo"); const str = await dotnet.HelloDotnetJS.Demo(); console.log(str); }; </script>
4. 運行效果
將所有文件部署到網(wǎng)站上,例如http://localhost:5678/:
weather.json的文件內(nèi)容如下:
[ { "date": "2018-05-06", "temperatureC": 1, "summary": "My IO" }, { "date": "2018-05-07", "temperatureC": 14, "summary": "Bracing" } ]
用瀏覽器訪問??http://localhost:5678/demo.html?
?,在控制臺窗口可以看到代碼運行正常:
四、結(jié)論
DotNetJS目前還不完善,生成的JS代碼文件??dotnet.js?
?尺寸較大,demo代碼就有11M。
到此這篇關(guān)于如何在JavaScript中運行.NET Core代碼詳情的文章就介紹到這了,更多相關(guān)JavaScript中運行.NET Core內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js實現(xiàn)不提示直接關(guān)閉網(wǎng)頁窗口
本文主要介紹了js實現(xiàn)不提示直接關(guān)閉網(wǎng)頁窗口的方法。具有很好的參考價值,下面跟著小編一起來看下吧2017-03-03ElementPlus?Tag標(biāo)簽用法小結(jié)
這篇文章主要介紹了ElementPlus?Tag標(biāo)簽用法,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09解決input輸入框僅支持輸入數(shù)字及兩位小數(shù)點的限制
這篇文章主要為大家介紹了解決input輸入框僅支持輸入數(shù)字及兩位小數(shù)點的限制技巧示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11淺談addEventListener和attachEvent的區(qū)別
下面小編就為大家?guī)硪黄獪\談addEventListener和attachEvent的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-07-07webpack4.0打包優(yōu)化策略整理小結(jié)
這篇文章主要介紹了webpack4.0打包優(yōu)化策略整理小結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03