DotNetJS 0.2.5
See the version list below for details.
dotnet add package DotNetJS --version 0.2.5
NuGet\Install-Package DotNetJS -Version 0.2.5
<PackageReference Include="DotNetJS" Version="0.2.5" />
paket add DotNetJS --version 0.2.5
#r "nuget: DotNetJS, 0.2.5"
// Install DotNetJS as a Cake Addin #addin nuget:?package=DotNetJS&version=0.2.5 // Install DotNetJS as a Cake Tool #tool nuget:?package=DotNetJS&version=0.2.5
This project is dedicated to providing a user-friendly workflow for consuming .NET C# programs and libraries in any JavaScript environments: be it browsers, node.js or custom restricted spaces, like web extensions for VS Code.
Quick Start
In C# project (.csproj) specify Microsoft.NET.Sdk.BlazorWebAssembly
SDK and import DotNetJS NuGet package:
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<LangVersion>10</LangVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="DotNetJS" Version="0.1.0"/>
</ItemGroup>
</Project>
To invoke a JavaScript function in C# use JS.Invoke(functionName, args)
method. To expose a C# method to JavaScript, use [JSInvokable]
attribute:
using System;
using DotNetJS;
using Microsoft.JSInterop;
namespace HelloWorld;
public static class Program
{
public static void Main ()
{
var hostName = JS.Invoke<string>("getName");
Console.WriteLine($"Hello {hostName}, DotNet here!");
}
[JSInvokable]
public static string GetName () => "DotNet";
}
Publish the project with dotnet publish
. A single-file UMD library containing the dotnet runtime and project assemblies will be produced in the "bin" directory. Namespace of the program will be used for both the library file name and main export object. Consume the library depending on the environment:
Browser
<script src="HelloWorld.js"></script>
<script>
// This function is invoked by DotNet.
window.getName = () => "Browser";
window.onload = async function () {
// Booting the DotNet runtime and invoking entry point.
await HelloWorld.boot();
// Invoking 'GetName()' method from DotNet.
const guestName = HelloWorld.invoke("GetName");
console.log(`Welcome, ${guestName}! Enjoy your global space.`);
};
</script>
Node.js
const HelloWorld = require("HelloWorld");
// This function is invoked by DotNet.
global.getName = () => "Node.js";
(async function () {
// Booting the DotNet runtime and invoking entry point.
await HelloWorld.boot();
// Invoking 'GetName()' method from DotNet.
const guestName = HelloWorld.invoke("GetName");
console.log(`Welcome, ${guestName}! Enjoy your CommonJS module space.`);
})();
Example Projects
You can find the following sample projects in this repository:
- Hello World — Consume DotNetJS-compiled program as a global import in browser, CommonJS or ECMAScript (ES) module in node.
- Web Extension — Consume the library in VS Code web extension, which works with both web and standalone versions of the IDE.
- Runtime Tests — Integration tests featuring various usage scenarios: async invocations, interop with instances, sending raw byte arrays, streaming, etc.
Build Properties
You can specify the following optional properties in .csproj to customize the build:
<Clean>false<Clean>
Do not clean the build output folders<LibraryName>CustomName</LibraryName>
Provide a custom name for the compiled library and export object.
For example, the following configuration will preserve the WebAssembly build artifacts and produce my-dotnet-lib.js
library with my-dotnet-lib
export object:
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<LangVersion>10</LangVersion>
<Clean>false</Clean>
<LibraryName>my-dotnet-lib</LibraryName>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="DotNetJS" Version="0.1.0"/>
</ItemGroup>
</Project>
Compiling Runtime
To compile and test the runtime run the following in order (under Runtime folder):
scripts/install-emsdk.sh
scripts/compile-runtime.sh
scripts/compile-test.sh
npm build
npm test
Publishing Runtime
A memo for the publishing process after modifying JS runtime.
- Bump NPM version on
./Runtime/package.json
and:
npm run build
scripts/publish-package.sh
- Bump NuGet version on
./DotNetJS/DotNetJS.csproj
and:
dotnet pack -c Release --output bin
dotnet nuget push bin/DotNetJS.{VER}.nupkg --api-key {KEY} --source https://api.nuget.org/v3/index.json
- Wait for the package indexing, bump NuGet version on
./Runtime/test/Test.csproj
and:
script/compile-test.sh
- Remind myself that this should be automated.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net6.0
- Microsoft.AspNetCore.Components.WebAssembly (>= 6.0.0)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on DotNetJS:
Package | Downloads |
---|---|
Plotly.WPF
Plotly.js in a WPF Control |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated | |
---|---|---|---|
0.23.4 | 1,796 | 5/14/2023 | |
0.23.3 | 873 | 2/21/2023 | |
0.23.2 | 290 | 2/21/2023 | |
0.23.1 | 556 | 1/27/2023 | |
0.23.0 | 346 | 1/27/2023 | |
0.22.0 | 454 | 1/21/2023 | |
0.21.1 | 384 | 12/23/2022 | |
0.21.0 | 464 | 12/5/2022 | |
0.20.0 | 406 | 12/4/2022 | |
0.19.0 | 396 | 11/24/2022 | |
0.18.0 | 830 | 11/20/2022 | |
0.17.1 | 531 | 10/15/2022 | |
0.17.0 | 482 | 10/10/2022 | |
0.16.0 | 556 | 10/1/2022 | |
0.15.1 | 502 | 9/1/2022 | |
0.15.0 | 556 | 8/24/2022 | |
0.14.0 | 601 | 7/1/2022 | |
0.13.8 | 576 | 6/6/2022 | |
0.13.7 | 457 | 6/4/2022 | |
0.13.5 | 455 | 6/4/2022 | |
0.13.4 | 482 | 6/4/2022 | |
0.13.3 | 446 | 6/3/2022 | |
0.13.2 | 482 | 5/24/2022 | |
0.13.1 | 493 | 5/23/2022 | |
0.13.0 | 491 | 5/22/2022 | |
0.12.0 | 489 | 5/21/2022 | |
0.11.0 | 508 | 5/21/2022 | |
0.10.1 | 470 | 5/19/2022 | |
0.10.0 | 548 | 5/1/2022 | |
0.9.2 | 465 | 4/29/2022 | |
0.9.1 | 493 | 4/17/2022 | |
0.9.0 | 463 | 4/8/2022 | |
0.8.2 | 527 | 3/22/2022 | |
0.8.1 | 477 | 3/9/2022 | |
0.8.0 | 490 | 2/20/2022 | |
0.7.3 | 636 | 2/16/2022 | |
0.6.3 | 519 | 2/12/2022 | |
0.6.2 | 499 | 2/9/2022 | |
0.5.4 | 496 | 2/8/2022 | |
0.5.3 | 604 | 2/1/2022 | |
0.5.2 | 530 | 1/17/2022 | |
0.5.1 | 487 | 1/13/2022 | |
0.5.0 | 516 | 1/13/2022 | |
0.4.1 | 355 | 1/10/2022 | |
0.4.0 | 361 | 12/24/2021 | |
0.3.13 | 339 | 12/23/2021 | |
0.3.12 | 657 | 12/4/2021 | |
0.3.11 | 926 | 12/1/2021 | |
0.3.8 | 369 | 11/30/2021 | |
0.2.5 | 892 | 11/21/2021 | |
0.2.0 | 503 | 11/19/2021 | |
0.1.0 | 377 | 11/18/2021 |