如何在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,一经查实,立即删除!

相关文章

表联接

表1&#xff1a;teacher------------| id | name |------------| 1 | 刘德华 || 2 | 张学友 || 4 | 黎明 |------------表2&#xff1a;student------------------| id | name | tea_id |------------------| 1 | 张三 | 1 || 2 | 李四 | 1 || 3 | 王五 | …

sql 之as(Aliases)别名(mysql)

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

C语言发展史(The development of the C language)-BCPL、B与C【转】

The Development of the C Language*Dennis M. RitchieBell Labs/Lucent TechnologiesMurray Hill, NJ 07974 USA 概要在1970s早期&#xff0c;C编程语言是作为新生的Unix操作系统的系统实现语言而设计的。衍生于无类型(typeless)语言BCPL&#xff0c;它进化出了一个类型结构【…

linux shell之find高级点的用法

1 查找当前目录a.txt和b.txt文件,下面的o是or的意思, -iname是忽略大小写的意思(-o -iname) find . -iname a.txt -o -iname b.txt 2 查找当前目录下的除了a.txt的文件(!) find . ! -iname "a.txt" 3 查看当前目前下的目录(-type d) find . -type d 4 查看当前目…

Java Eclipse开发环境搭建及注意事项

一、所需工具 (1)JDK(http://www.oracle.com/technetwork/java/javase/downloads/index.html) (2)Tomcat 7.0(http://tomcat.apache.org/download-70.cgi,选择: 32-bit/64-bit Windows Service Installer (pgp,

基于.NetCore开发博客项目 StarBlog - (3) 模型设计

系列文章基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客&#xff1f;基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目基于.NetCore开发博客项目 StarBlog - (3) 模型设计...基于.NetCore开发博客项目 StarBlog - 接口返回值包装基于.NetCore开…

matlab读取文件夹下所有文件的字符串,MATLAB读取文件夹下所有文件的文件名并读取数据...

MATLAB读取文件夹下特定类型格式文件的文件名并读取该格式文件的数据利用代码对大量数据进行自动批处理时&#xff0c;首先需要获取该数据存放的文件夹(文件夹路径)&#xff0c;然后获取该文件夹下某一类型数据所有的文件名&#xff0c;最后通过特定的数据读取代码读取数据进行…

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

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

显示学生各科成绩和总成绩-面试被问到

表结构如下&#xff1a; name schedule score 张三 语文 20张三 数学 60张三 英语 80李四 数学 30李四 英语 60李四 语文 80 想要的结果如下&#xff1a; 姓名 语文 数学 英语 总成绩 …

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结构才能支持它们“进程间通信”的功能。 有两个东…

linux shell之得到当前路径下的目录

方法1 find . -type d 方法2 ^是开头开头得意思&#xff0c;然后d是dictionary意思 ls -al | grep ^d 方法3 ls -F | grep /$ 方法4 ls -d */

python中html.parser_在Python中使用HTMLParser解析HTML的教程

如果我们要编写一个搜索引擎&#xff0c;第一步是用爬虫把目标网站的页面抓下来&#xff0c;第二步就是解析该HTML页面&#xff0c;看看里面的内容到底是新闻、图片还是视频。假设第一步已经完成了&#xff0c;第二步应该如何解析HTML呢&#xff1f;HTML本质上是XML的子集&…

分别统计出其中英文字母、空格、数字和其它字符的个数 matlab 程序,编写一段程序,要求先输入一行字符,然后分别统计出其中英文...

编写一个求和的程序,要求能任意输入两个整数,求和 用javascript写functionadd(){varAdocument.getElementById("a").value;varBdocument.getElementById("b").value;varA用C语言编写一段程序,输入一行字符,分别统计出其中的英文字母、空格、数字和其他字符…

【ArcGIS遇上Python】长时间序列(30年)每两组栅格数据对应做减法运算求物候参数

Python语言在ArcGIS软件中发挥着乾坤大挪移的作用,然而很多人并不知道它的厉害之处。今天我们利用Python语言来批处理遥感物候数据,获取物候期的参数。 说明: (1)Up_Path:始期数据路径变量 (2)Down_Path:末期数据路径变量 (3)outPath:相减输出结果路径变量 完…

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;为什么笔者…

数据结构(java语言描述)顺序栈的使用

&#xff11;&#xff0e;声明Istack接口&#xff1b; package stack;public interface Istack { public void clear(); public boolean isEmpty(); public int length(); public Object peek(); public void push(Object x) throws Exception; public Objec…

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

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

linux shell之xargs 、tr、sha1sum、head、tail一般使用

1 xargs命令 有点类似-exec命令 1&#xff09;删除当前目录下面的c文件 find . -name "*.c" | xargs rm 2&#xff09;统计当前c文件里面的代码行数 find . -name "*.c" | xargs wc -l 2 tr命令 替换命令 1&#xff09;把大小替换成小写 echo &quo…