如何在JavaScript中運(yùn)行.NET?Core代碼詳情
一、前言
在.NET Core中運(yùn)行JavaScript代碼,目前已經(jīng)有很多實(shí)現(xiàn)方案。
但是,如果你希望在純JavaScript環(huán)境中運(yùn)行.NET Core代碼呢?
那么,DotNetJS可能對(duì)你有所幫助。
二、DotNetJS
DotNetJS可以將C#項(xiàng)目編譯為與任何環(huán)境兼容的單文件JavaScript庫(kù),無(wú)論是Web瀏覽器,Node.js還是自定義限制空間,如VS Code的Web擴(kuò)展,都可以正常使用它。
該解決方案基于兩個(gè)主要組件:
- JavaScript/dotnet-runtime(npm)使用已編譯的C#程序集和.NET運(yùn)行時(shí)WebAssembly模塊,以在JavaScript中提供C# 操作性層。該庫(kù)與環(huán)境無(wú)關(guān) - 它不依賴于特定于平臺(tái)的API,如瀏覽器DOM或節(jié)點(diǎn)模塊,并且可以作為CommonJS或ECMAScript模塊導(dǎo)入,也可以通過(guò)瀏覽器中的腳本標(biāo)記使用。
- DotNet/dotNetJS(NuGet)在C#中提供JavaScript互操作性層,并通過(guò)MSBuild任務(wù)將項(xiàng)目輸出打包到單文件JavaScript庫(kù)中。生成的庫(kù)包含使用項(xiàng)目程序集初始化的dotnet運(yùn)行時(shí),并準(zhǔn)備用作打包的C#項(xiàng)目的互操作性層。
三、Demo
1. 創(chuàng)建項(xiàng)目
使用VS2022創(chuàng)建一個(gè)控制臺(tái)項(xiàng)目,修改項(xià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. 實(shí)現(xiàn)C#代碼
實(shí)現(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]指定具體值來(lái)源于JS傳入;
- 訪問(wèn)網(wǎng)站根路徑下的
weather.json文件 - 反序列化json,調(diào)用Newtonsoft驗(yàn)證第三方庫(kù)能否正常使用;
- 返回
WeatherForecast集合
在終端窗口執(zhí)行??dotnet publish???,上述代碼將會(huì)編譯成JS代碼文件??dotnet.js??。
3. 實(shí)現(xiàn)JS代碼
創(chuàng)建demo.html,代碼如下:
<meta charset="UTF-8">
<script src="dotnet.js"></script>
<script>
//定義GetBaseAddress實(shí)現(xiàn)
dotnet.HelloDotnetJS.GetBaseAddress = () => window.location.protocol + "http://" + window.location.host;
window.onload = async function () {
//初始化
await dotnet.boot();
console.log("開(kāi)始執(zhí)行Demo");
const str = await dotnet.HelloDotnetJS.Demo();
console.log(str);
};
</script>4. 運(yùn)行效果
將所有文件部署到網(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"
}
]用瀏覽器訪問(wèn)??http://localhost:5678/demo.html??,在控制臺(tái)窗口可以看到代碼運(yùn)行正常:

四、結(jié)論
DotNetJS目前還不完善,生成的JS代碼文件??dotnet.js??尺寸較大,demo代碼就有11M。
到此這篇關(guān)于如何在JavaScript中運(yùn)行.NET Core代碼詳情的文章就介紹到這了,更多相關(guān)JavaScript中運(yùn)行.NET Core內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- .NET Core 處理 WebAPI JSON 返回?zé)┤说膎ull為空
- .net core中編輯json配置文件的方法
- asp.net core 使用 tensorflowjs實(shí)現(xiàn) face recognition的源代碼
- ASP.NET Core應(yīng)用程序配置文件AppSetting.json
- 為什么ASP.NET Core 數(shù)據(jù)庫(kù)連接串的值和appsettings.json配的不一樣?
- ASP.NET?CORE讀取json格式配置文件
- .NET?Core類(lèi)庫(kù)項(xiàng)目中讀取appsettings.json配置的方法
相關(guān)文章
重寫(xiě)javascript中window.confirm的行為
javascript中window.confirm這個(gè)方法很好用,可以彈出一個(gè)確認(rèn)對(duì)話框.但有一個(gè)問(wèn)題是,它默認(rèn)的情況下,將選中那個(gè)"確定"按鈕,當(dāng)用戶有意無(wú)意的在鍵盤(pán)回車(chē),就是說(shuō)按下Enter鍵的時(shí)候,就會(huì)自動(dòng)返回true。在很多時(shí)候其實(shí)我們不希望這樣2012-10-10
微信小程序?qū)崿F(xiàn)左滑動(dòng)刪除效果
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)左滑動(dòng)刪除效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
bootstrap datetimepicker 日期插件在火狐下出現(xiàn)一條報(bào)錯(cuò)信息的原因分析及解決辦法
日期插件 bootstrap-datetimepicker 在火狐下出現(xiàn)一條報(bào)錯(cuò)信息:TypeError: (intermediate value).toString(…).split(…)[1] is undefined.什么原因?qū)е碌哪?,下面小編給大家分享解決思路,需要的朋友參考下2017-03-03
分享十八個(gè)殺手級(jí)JavaScript單行代碼
這篇文章主要給大家分享了十八個(gè)殺手級(jí)JavaScript單行代碼,這些單行代碼可以幫助你提高工作效率并可以幫助調(diào)試代碼,對(duì)大家學(xué)習(xí)或者使用JavaScript具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-10-10
js調(diào)試系列 控制臺(tái)命令行API使用方法
上次初步介紹了什么是控制臺(tái),以及簡(jiǎn)單的 console.log 輸出信息。最后還有兩個(gè)小問(wèn)題,我們就當(dāng)回顧,來(lái)看下怎么操作吧2014-06-06
js獲取瀏覽器的可視區(qū)域尺寸的實(shí)現(xiàn)代碼
js獲取瀏覽器的可視區(qū)域尺寸的實(shí)現(xiàn)代碼,需要的朋友可以參考下。2011-11-11

