DotNetJS 0.2.5

Suggested Alternatives

Bootsharp

There is a newer version of this package available.
See the version list below for details.
dotnet add package DotNetJS --version 0.2.5
NuGet\Install-Package DotNetJS -Version 0.2.5
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="DotNetJS" Version="0.2.5" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add DotNetJS --version 0.2.5
#r "nuget: DotNetJS, 0.2.5"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// 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

NuGet npm CodeFactor codecov CodeQL

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.

  1. Bump NPM version on ./Runtime/package.json and:
  • npm run build
  • scripts/publish-package.sh
  1. 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
  1. Wait for the package indexing, bump NuGet version on ./Runtime/test/Test.csproj and:
  • script/compile-test.sh
  1. Remind myself that this should be automated.
Product 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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,640 5/14/2023
0.23.3 854 2/21/2023
0.23.2 276 2/21/2023
0.23.1 523 1/27/2023
0.23.0 316 1/27/2023
0.22.0 424 1/21/2023
0.21.1 370 12/23/2022
0.21.0 428 12/5/2022
0.20.0 374 12/4/2022
0.19.0 362 11/24/2022
0.18.0 800 11/20/2022
0.17.1 500 10/15/2022
0.17.0 442 10/10/2022
0.16.0 539 10/1/2022
0.15.1 460 9/1/2022
0.15.0 521 8/24/2022
0.14.0 566 7/1/2022
0.13.8 537 6/6/2022
0.13.7 441 6/4/2022
0.13.5 421 6/4/2022
0.13.4 446 6/4/2022
0.13.3 414 6/3/2022
0.13.2 468 5/24/2022
0.13.1 460 5/23/2022
0.13.0 458 5/22/2022
0.12.0 457 5/21/2022
0.11.0 474 5/21/2022
0.10.1 455 5/19/2022
0.10.0 515 5/1/2022
0.9.2 449 4/29/2022
0.9.1 461 4/17/2022
0.9.0 451 4/8/2022
0.8.2 493 3/22/2022
0.8.1 461 3/9/2022
0.8.0 457 2/20/2022
0.7.3 581 2/16/2022
0.6.3 485 2/12/2022
0.6.2 468 2/9/2022
0.5.4 465 2/8/2022
0.5.3 572 2/1/2022
0.5.2 496 1/17/2022
0.5.1 472 1/13/2022
0.5.0 483 1/13/2022
0.4.1 323 1/10/2022
0.4.0 328 12/24/2021
0.3.13 308 12/23/2021
0.3.12 625 12/4/2021
0.3.11 895 12/1/2021
0.3.8 338 11/30/2021
0.2.5 859 11/21/2021
0.2.0 467 11/19/2021
0.1.0 363 11/18/2021