如何在JavaScript中运行.NET Core代码

前言

在.NET Core中运行JavaScript代码,目前已经有很多实现方案。

但是,如果你希望在纯JavaScript环境中运行.NET Core代码呢?

那么,DotNetJS可能对你有所帮助。

DotNetJS

DotNetJS可以将C#项目编译为与任何环境兼容的单文件JavaScript库,无论是Web浏览器,Node.js还是自定义限制空间,如VS Code的Web扩展,都可以正常使用它。

该解决方案基于两个主要组件:

  • JavaScript/dotnet-runtime(npm) 使用已编译的C#程序集和.NET运行时WebAssembly模块,以在JavaScript中提供C# 操作性层。该库与环境无关 - 它不依赖于特定于平台的API,如浏览器DOM或节点模块,并且可以作为CommonJS或ECMAScript模块导入,也可以通过浏览器中的脚本标记使用。

  • DotNet/dotNetJS(NuGet) 在C#中提供JavaScript互操作性层,并通过MSBuild任务将项目输出打包到单文件JavaScript库中。生成的库包含使用项目程序集初始化的dotnet运行时,并准备用作打包的C#项目的互操作性层。

Demo

1. 创建项目

使用VS2022创建一个控制台项目,修改项目文件,文件内容如下:

<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. 实现C#代码

实现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方法的具体逻辑如下:

  • 获取网站根路径,使用[JSFunction]指定具体值来源于JS传入

  • 访问网站根路径下的weather.json文件

  • 反序列化json,调用Newtonsoft验证第三方库能否正常使用

  • 返回WeatherForecast集合

在终端窗口执行dotnet publish,上述代码将会编译成JS代码文件dotnet.js

3. 实现JS代码

创建demo.html,代码如下:

<meta charset="UTF-8"><script src="dotnet.js"></script><script>//定义GetBaseAddress实现dotnet.HelloDotnetJS.GetBaseAddress = () => window.location.protocol + "//" + window.location.host;window.onload = async function () {//初始化await dotnet.boot();console.log("开始执行Demo");const str = await dotnet.HelloDotnetJS.Demo();console.log(str);};</script>

4. 运行效果

将所有文件部署到网站上,例如http://localhost:5678/: 

699535cf6c19bef93ca5a1fad6c2be2a.png

weather.json的文件内容如下:

[{"date": "2018-05-06","temperatureC": 1,"summary": "My IO"},{"date": "2018-05-07","temperatureC": 14,"summary": "Bracing"}
]

用浏览器访问http://localhost:5678/demo.html,在控制台窗口可以看到代码运行正常: 

e82f16fdea52148cae3098d56494f01c.png

结论

DotNetJS目前还不完善,生成的JS代码文件dotnet.js尺寸较大,demo代码就有11M。

如果你有更好的解决方案,欢迎到我的公众号"My IO"后台留言讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql 之as(Aliases)别名(mysql)

使用别名主要原因是因为如果在很多表的时候&#xff0c;我们的表名可能会混淆&#xff0c;导致语句不清晰&#xff0c;那么我们使用别名就可以让我们操作数据库表的时候更加清晰明了&#xff0c;那么我们假设有如下表&#xff1a; 那么我们查找我们age1的值为11的数据&#…

sqlserver建表语句_重新认识MySQL中的COUNT语句

在数据库的增删改查操作中&#xff0c;使用最频繁的就是查询操作。而在所有查询操作中&#xff0c;统计数量操作更是经常被用到。关于数据库中行数统计&#xff0c;无论是MySQL还是Oracle亦或者是SqlServer&#xff0c;都有一个函数可以使用&#xff0c;那就是COUNT。而对于COU…

sql INNER JOIN 取得两个表中存在连接匹配关系的记录(mysql)

首先&#xff1a;JOIN 通常与 ON 关键字搭配使用 其次我们来看我们的两个表格&#xff1a; table1: table2: 在这里&#xff0c;INNER JOIN&#xff08;内连接,或等值连接&#xff09;&#xff1a;取得两个表中存在连接匹配关系的记录。 例如我要取到table1和table2之…

【Linux】IPC-消息队列

问题 消息队列id 和键值KEY区别&#xff1f; 首先要注意一个概念&#xff1a;IPC结构都是内核的结构。也就是说IPC结构由内核维护&#xff0c;对于每个进程都是公共的&#xff0c;不属于某个特定进程。只有这样&#xff0c;IPC结构才能支持它们“进程间通信”的功能。 有两个东…

Blazor University (14)渲染树

原文链接&#xff1a;https://blazor-university.com/components/render-trees/渲染树当浏览器呈现内容时&#xff0c;它不仅绘制 HTML 中定义的元素&#xff0c;还必须根据页面大小&#xff08;元素流&#xff09;计算绘制它们的位置。例如&#xff0c;以下 Bootstrap HTML 将…

思科加强生成树性能的属性(Portfast /Uplinkfast/BackboneFast)与RSTP的关系

思科加强生成树性能的属性&#xff08;Portfast/Uplinkfast/BackboneFast&#xff09;与RSTP的关系本文截自于博主CCNP交换技术稿件内容4.2.6思科加强生成树性能的属性&#xff08;Portfast/Uplinkfast/BackboneFast&#xff09;与RSTP的关系首先说明一下&#xff0c;为什么笔者…

sql LEFT JOIN RIGHT JOIN(左连接)(mysql)

我们首先来看我们的两个表&#xff1a; table1: table2: 在这里&#xff0c;LEFT JOIN&#xff08;内连接,或等值连接&#xff09;&#xff1a;取得左表&#xff08;table1&#xff09;完全记录&#xff0c;即是右表&#xff08;table2&#xff09;并无对应匹配记录。 …

php的_auto,AutoPHPCheck下载

AutoPHPCheck官方版是一款相当优秀的php开发人员专用PHP验证工具&#xff0c;AutoPHPCheck官方版功能全面&#xff0c;便捷好用&#xff0c;支持执行快速验证来帮助您确保代码的安全性&#xff0c;并且软件还附带了一个基本的语法检查器&#xff0c;可以查找并帮助您处理错误。…

【ArcGIS遇上Python】Python实现点转栅格(PointToRaster)

在ArcGIS中提供了点转栅格(PointToRaster)的工具,如下所示: 参数说明: (1)file:点图层(.shp) (2)data:值字段 (3)outFile:转换后的栅格图层 (4)9660.848118:空间分辨率 python批处理代码: import arcpy arcpy.gp.overwriteOutput=1 arcpy.env.workspace=&…

ASP.NET Core认证授权方案

前言在前面我讲过基于token的权限认证&#xff0c;然后前几天有小伙伴私信我&#xff0c;怎么做一个身份认证也就是授权。在Asp.net Core常见的授权方式有:基于角色的授权&#xff0c;有基于声明的授权&#xff0c;有基于策略的授权&#xff0c; 这三种授权我就不做过多介绍了,…

插入排序—直接插入排序(Straight Insertion Sort)

基本思想: 将一个记录插入到已排序好的有序表中&#xff0c;从而得到一个新&#xff0c;记录数增1的有序表。即&#xff1a;先将序列的第1个记录看成是一个有序的子序列&#xff0c;然后从第2个记录逐个进行插插入到已入&#xff0c;直至整个序列有序为止。 要点&#xff1a;设…

SQL UNION 和 UNION ALL 操作符(mysql)

首先看两个表&#xff1a; table1: table2: 如果我们要查询table1表和 table2表中的 name1的值&#xff0c;但是不存在重复的值一起输出出来&#xff0c;那么就可以用union操作符&#xff1a; SELECT name1 FROM table1 UNION SELECT name1 FROM table2 结果我们会查…

redis php方案,Redis三种部署方案图文详解

standaloan(单机模式)standaloan 是redis单机模式&#xff0c;及所有服务连接一台redis服务&#xff0c;该模式不适用生产。如果发生宕机&#xff0c;内存爆炸&#xff0c;就可能导致所有连接改redis的服务发生缓存失效引起雪崩。(推荐&#xff1a;redis视频教程)ssentinel(哨兵…

抛开flash,自己开发实现C++ RTMP直播流播放器

众所周知&#xff0c;RTMP是以flash为客户端播放器的直播协议&#xff0c;主要应用在B/S形式的场景中。本人研究并用C开发实现了RTMP直播流协议的播放器&#xff0c;结合之前做的RTMP直播采集端&#xff0c;可以将RTMP协议完全扩展到C/S形式的应用场景中&#xff0c;这将对之后…

.NET 程序读取当前目录避坑指南

前些天有 AgileConfig 的用户反映&#xff0c;如果把 AgileConfig 部署成 Windows 服务程序会启动失败。我看了一下日志&#xff0c;发现根目录被定位到了 C:\Windows\System32 下&#xff0c;那么读取 appsettings.json 配置文件自然就失败了。var builder new Configuration…

Liststring[] 如何去重

List<string[]> 如何去重&#xff0c;代码如下: static void Main(string[] args){List<string[]> list new List<string[]>();list.Add(new string[] { "1", "2", "3" });list.Add(new string[] { "1" });list.Ad…

前端大屏模板分享-可在线浏览

1. 前言站长以前介绍过这个开源项目&#xff0c;最近又有人在问&#xff0c;索性挂在Dotnet9网站上&#xff0c;方便大家在线浏览&#xff0c;先声明&#xff0c;模板来自下面的仓库&#xff1a;仓库名&#xff1a;大屏数据展示模板作者&#xff1a;lvyeyou开源协议&#xff1a…

音视频基本概念和FFmpeg的简单入门

写在前面最近正好有音视频编辑的需求&#xff0c;虽然之前粗略的了解过FFmpeg不过肯定是不够用的&#xff0c;借此重新学习下&#xff1b;基本概念容器/文件(Conainer/File)&#xff1a;即特定格式的多媒体文件&#xff0c;一般来说一个视频文件是由视频&#xff0c;音频&#…

Windows Live Writer 的昨日荣光

今天这一篇文章&#xff0c;想写一写Windows Live Writer这款博客编辑器&#xff08;最早的一个版本是2007年发布的&#xff09;。毫不夸张地说&#xff0c;这是为数不多的几款所见即所得的编辑器之一&#xff0c;当然&#xff0c;它的运行速度慢也是一个众所周知的问题。作为一…

猎豹MFC--CMenu菜单 设置主菜单 给主对话框设置菜单 设置快捷菜单

设置主菜单&#xff08;不是快捷菜单&#xff09;&#xff1a;给主对话框设置菜单&#xff1a;效果如下&#xff1a;修改菜单的ID使之便于记忆&#xff1a;给菜单添加消息处理&#xff1a;添加处理代码&#xff1a;设置快捷菜单&#xff1a;打开对话框&#xff0c;属性添加消息…