improve wasm support - #3020

Merged
timcassell merged 15 commits into
dotnet:masterfrom
twobrainsgmbh:improve-wasm
Mar 2, 2026
Merged

improve wasm support#3020
timcassell merged 15 commits into
dotnet:masterfrom
twobrainsgmbh:improve-wasm

Conversation

@FreyLuis

@FreyLuisFreyLuis commented Feb 22, 2026

Copy link
Copy Markdown
Contributor

This PR aims to improve WASM support (as described in #2890) in a few ways:

  • Benchmarking WASM on Windows is now supported.
  • Running on node.js is now supported.
  • The JavaScriptEngine now resolves executables from the PATH.
  • A new mainJsTemplatePath option allows customizing the startup script (with polyfill, for example).
  • Removed unnecessary --wasmDataDir option, that was used by dotnet/performance to set WasmMainJSPath.
  • Removed outdated--expose_wasm as default args for javaScriptEngineArguments.
  • run-selected-tests pipeline fixed with wasm

AOT currently fails because the unit tests set only MonoAotCompilerMode and not the WasmRuntimes aot option. I've fixed the test and disabled it for now.

@FreyLuisFreyLuis changed the title Improve wasmimprove wasm supportFeb 22, 2026
@timcassell

Copy link
Copy Markdown
Collaborator

AOT currently fails because the unit tests set only MonoAotCompilerMode and not the WasmRuntimes aot option. I've fixed the test and disabled it for now.

Looking at the code, WasmRuntime.Aot isn't actually used. The toolchain passes aot: netCoreAppSettings.AOTCompilerMode == MonoAotLLVM.MonoAotCompilerMode.wasm to the generator. If the tests are failing, it's due to your changes. They should not be disabled.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

Looking at the code, WasmRuntime.Aot isn't actually used. The toolchain passes aot: netCoreAppSettings.AOTCompilerMode == MonoAotLLVM.MonoAotCompilerMode.wasm to the generator.

It is used right here which then sets the RunAOTCompilation flag.

I have a ci run without the last commit on main, that worked. It seems like the switch to the Microsoft.NET.Sdk.WebAssembly causes some issues with my changes. I'll see if i can fix that later.

Comment threadtests/BenchmarkDotNet.IntegrationTests/WasmTests.cs Outdated
@timcassell

Copy link
Copy Markdown
Collaborator

It is used right here which then sets the RunAOTCompilation flag.

Oh, duh, not sure how I missed that. What a mess, that could use some cleanup, too. So the test was never actually testing aot.

@timcassell

Copy link
Copy Markdown
Collaborator

I have a ci run without the last commit on main, that worked. It seems like the switch to the Microsoft.NET.Sdk.WebAssembly causes some issues with my changes. I'll see if i can fix that later.

Maybe the wwwroot is necessary? I also have a green CI run where I had it running on node, with minimal other changes to the toolchain (besides the async refactor and mjs changes for websocket).

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

I don't know why the build doesn't fail in the ci, it crashes on my windows machine with the following errors:

 C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.FSharp\release_net8.0\BenchmarkDotNet.IntegrationTests.FSharp.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.FSharp\BenchmarkDotNet.IntegrationTests.FSharp.fsproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.VisualBasic\release_net8.0\BenchmarkDotNet.IntegrationTests.VisualBasic.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.VisualBasic\BenchmarkDotNet.IntegrationTests.VisualBasic.vbproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.Diagnostics.dotTrace\release_net8.0\BenchmarkDotNet.Diagnostics.dotTrace.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\src\BenchmarkDotNet.Diagnostics.dotTrace\BenchmarkDotNet.Diagnostics.dotTrace.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.Diagnostics.dotMemory\release_net8.0\BenchmarkDotNet.Diagnostics.dotMemory.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\src\BenchmarkDotNet.Diagnostics.dotMemory\BenchmarkDotNet.Diagnostics.dotMemory.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.Static\release_net8.0\BenchmarkDotNet.IntegrationTests.Static.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.Static\BenchmarkDotNet.IntegrationTests.Static.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.EnabledOptimizations\release_net8.0\BenchmarkDotNet.IntegrationTests.EnabledOptimizations.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.EnabledOptimizations\BenchmarkDotNet.IntegrationTests.EnabledOptimizations.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.DisabledOptimizations\release_net8.0\BenchmarkDotNet.IntegrationTests.DisabledOptimizations.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.DisabledOptimizations\BenchmarkDotNet.IntegrationTests.DisabledOptimizations.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly\release_net8.0\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly.csproj::TargetFramework=net8.0]

It does work with a minimal project (including main.js path).
The main.js error seems to only happen in the integration tests...

I'll see if i can fix this tomorrow.

@FreyLuis
FreyLuis marked this pull request as ready for review February 24, 2026 21:53
@FreyLuis

FreyLuis commented Feb 24, 2026

Copy link
Copy Markdown
ContributorAuthor

@timcassell It works now.

The IntigrationTests still fail while building the dllgatherer on windows on my pc, but i couldn't reproduce it on another machine or with another project.

Like I wrote in the description, this does remove the --wasmDataDir argument and breaks the current state of dotnet/performance. There is already a PR that removes it.

I've noticed an odd behavior that I did not want to touch: When I set KeepBenchmarkFiles to true and build the project twice, it references all dlls from the previous build. I'm not sure if BenchmarkDotNet should delete the dlls before reusing the folder or build in another folder instead.

@timcassell

Copy link
Copy Markdown
Collaborator

The IntigrationTests still fail while building the dllgatherer on windows on my pc, but i couldn't reproduce it on another machine or with another project.

What's the error?

I've noticed an odd behavior that I did not want to touch: When I set KeepBenchmarkFiles to true and build the project twice, it references all dlls from the previous build. I'm not sure if BenchmarkDotNet should delete the dlls before reusing the folder or build in another folder instead.

KeepBenchmarkFiles is intended for debugging. The user is expected to delete it before running benchmarks again. I don't think we need to do anything about it.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

What's the error?

 // start dotnet build "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj" -f net8.0 -c Release --no-restore --no-dependencies --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true -bl:BenchmarkDotNet.IntegrationTests-1-build-no-restore-no-deps.binlog in C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1
C:\Users\luis\.nuget\packages\verify\31.12.5\buildTransitive\Verify.props(70,5): warning : No solution files found. Unable to auto-discover SolutionDir and SolutionName. Verify searches for .slnx and .sln files in the project directory 'C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1', parent directory, and parent's parent directory. To resolve this, either add a solution file to one of these locations, or explicitly set SolutionDir and SolutionName via command line: /p:SolutionDir="C:\Path\To\Solution\" /p:SolutionName="MySolution" [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
BenchmarkDotNet.Autogenerated -> C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1.dll
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
Build FAILED.
C:\Users\luis\.nuget\packages\verify\31.12.5\buildTransitive\Verify.props(70,5): warning : No solution files found. Unable to auto-discover SolutionDir and SolutionName. Verify searches for .slnx and .sln files in the project directory 'C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1', parent directory, and parent's parent directory. To resolve this, either add a solution file to one of these locations, or explicitly set SolutionDir and SolutionName via command line: /p:SolutionDir="C:\Path\To\Solution\" /p:SolutionName="MySolution" [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
1 Warning(s)
6 Error(s)
Time Elapsed 00:00:39.44

Looks like the error happened while building BenchmarkDotNet.Autogenerated. The dllgatherer only crashed because I didn't build the project before running the IntigrationTests. All those files do exist.

BenchmarkDotNet.IntegrationTests-1-build-no-restore-no-deps.binlog.zip

@timcassell

Copy link
Copy Markdown
Collaborator

Looks like there's a merge conflict.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

Looks like there's a merge conflict.

Should be fixed now.

https://github.com/twobrainsgmbh/BenchmarkDotNet/actions/runs/22404078490

Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmGenerator.cs Outdated
<WasmTargetsPath>$([System.IO.Path]::ChangeExtension('$(OriginalCSProjPath)', '.Wasm.targets'))</WasmTargetsPath>
<WasmDataDir>$WASMDATADIR$</WasmDataDir>
<WasmDataDir Condition="'$(WasmDataDir)' != ''">$([MSBuild]::NormalizeDirectory($(WasmDataDir)))</WasmDataDir>
<WasmMainJSPath>$MAINJS$</WasmMainJSPath>

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ilonatommy You recently changed away from this property, what are your thoughts here?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, it should work for publish.

Comment threadsrc/BenchmarkDotNet/Helpers/ProcessHelper.cs
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmToolchain.cs Outdated
Comment threadsrc/BenchmarkDotNet/ConsoleArguments/ConfigParser.cs Outdated
Comment threadsrc/BenchmarkDotNet/Environments/Runtimes/WasmRuntime.cs Outdated
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmToolchain.cs Outdated
@timcasselltimcassell linked an issue Feb 27, 2026 that may be closed by this pull request
@timcassell

Copy link
Copy Markdown
Collaborator

@pavelsavarapavelsavara left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, but wait for Ilona's review

Comment threadsrc/BenchmarkDotNet/Templates/benchmark-main.mjs Outdated
Comment threadtests/BenchmarkDotNet.IntegrationTests/WasmTests.cs
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmGenerator.cs Outdated
Comment threadsrc/BenchmarkDotNet/ConsoleArguments/CommandLineOptions.cs Outdated
Comment threadsrc/BenchmarkDotNet/Environments/Runtimes/WasmRuntime.cs Outdated
FreyLuisand others added 2 commits March 1, 2026 21:34
Co-authored-by: Tim Cassell <cassell.timothy@gmail.com>
Co-authored-by: Tim Cassell <cassell.timothy@gmail.com>
<WasmTargetsPath>$([System.IO.Path]::ChangeExtension('$(OriginalCSProjPath)', '.Wasm.targets'))</WasmTargetsPath>
<WasmDataDir>$WASMDATADIR$</WasmDataDir>
<WasmDataDir Condition="'$(WasmDataDir)' != ''">$([MSBuild]::NormalizeDirectory($(WasmDataDir)))</WasmDataDir>
<WasmMainJSPath>$MAINJS$</WasmMainJSPath>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, it should work for publish.

=> HashCode.Combine(base.GetHashCode(), JavaScriptEngine, JavaScriptEngineArguments, Aot, RuntimeFlavor);
=> HashCode.Combine(base.GetHashCode(), JavaScriptEngine, JavaScriptEngineArguments, JavaScriptEngineArgumentFormatter, IsAOT, RuntimeFlavor, ProcessTimeoutMinutes);

private static string DefaultArgumentFormatter(WasmRuntime runtime, ArtifactsPaths artifactsPaths, string args)

@ilonatommyilonatommyMar 2, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will it be coupled with a PR in perf repo? This formatter introduces double --module for v8 currently.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I've prepared a branch that removes --module as an argument.

FreyLuis/dotnet-performance@2b67d2f

@timcasselltimcassell left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @FreyLuis

@timcassell
timcassell merged commit 79a28f2 into dotnet:masterMar 2, 2026
11 checks passed
@timcasselltimcassell added this to the v0.16.0 milestone Mar 2, 2026
@FreyLuis
FreyLuis deleted the improve-wasm branch March 2, 2026 19:51
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

improve wasm support

4 participants

@FreyLuis@timcassell@pavelsavara@ilonatommy
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

improve wasm support - #3020

Merged
timcassell merged 15 commits into
dotnet:masterfrom
twobrainsgmbh:improve-wasm
Mar 2, 2026
Merged

improve wasm support#3020
timcassell merged 15 commits into
dotnet:masterfrom
twobrainsgmbh:improve-wasm

Conversation

@FreyLuis

@FreyLuisFreyLuis commented Feb 22, 2026

Copy link
Copy Markdown
Contributor

This PR aims to improve WASM support (as described in #2890) in a few ways:

  • Benchmarking WASM on Windows is now supported.
  • Running on node.js is now supported.
  • The JavaScriptEngine now resolves executables from the PATH.
  • A new mainJsTemplatePath option allows customizing the startup script (with polyfill, for example).
  • Removed unnecessary --wasmDataDir option, that was used by dotnet/performance to set WasmMainJSPath.
  • Removed outdated--expose_wasm as default args for javaScriptEngineArguments.
  • run-selected-tests pipeline fixed with wasm

AOT currently fails because the unit tests set only MonoAotCompilerMode and not the WasmRuntimes aot option. I've fixed the test and disabled it for now.

@FreyLuisFreyLuis changed the title Improve wasmimprove wasm supportFeb 22, 2026
@timcassell

Copy link
Copy Markdown
Collaborator

AOT currently fails because the unit tests set only MonoAotCompilerMode and not the WasmRuntimes aot option. I've fixed the test and disabled it for now.

Looking at the code, WasmRuntime.Aot isn't actually used. The toolchain passes aot: netCoreAppSettings.AOTCompilerMode == MonoAotLLVM.MonoAotCompilerMode.wasm to the generator. If the tests are failing, it's due to your changes. They should not be disabled.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

Looking at the code, WasmRuntime.Aot isn't actually used. The toolchain passes aot: netCoreAppSettings.AOTCompilerMode == MonoAotLLVM.MonoAotCompilerMode.wasm to the generator.

It is used right here which then sets the RunAOTCompilation flag.

I have a ci run without the last commit on main, that worked. It seems like the switch to the Microsoft.NET.Sdk.WebAssembly causes some issues with my changes. I'll see if i can fix that later.

Comment threadtests/BenchmarkDotNet.IntegrationTests/WasmTests.cs Outdated
@timcassell

Copy link
Copy Markdown
Collaborator

It is used right here which then sets the RunAOTCompilation flag.

Oh, duh, not sure how I missed that. What a mess, that could use some cleanup, too. So the test was never actually testing aot.

@timcassell

Copy link
Copy Markdown
Collaborator

I have a ci run without the last commit on main, that worked. It seems like the switch to the Microsoft.NET.Sdk.WebAssembly causes some issues with my changes. I'll see if i can fix that later.

Maybe the wwwroot is necessary? I also have a green CI run where I had it running on node, with minimal other changes to the toolchain (besides the async refactor and mjs changes for websocket).

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

I don't know why the build doesn't fail in the ci, it crashes on my windows machine with the following errors:

 C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.FSharp\release_net8.0\BenchmarkDotNet.IntegrationTests.FSharp.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.FSharp\BenchmarkDotNet.IntegrationTests.FSharp.fsproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.VisualBasic\release_net8.0\BenchmarkDotNet.IntegrationTests.VisualBasic.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.VisualBasic\BenchmarkDotNet.IntegrationTests.VisualBasic.vbproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.Diagnostics.dotTrace\release_net8.0\BenchmarkDotNet.Diagnostics.dotTrace.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\src\BenchmarkDotNet.Diagnostics.dotTrace\BenchmarkDotNet.Diagnostics.dotTrace.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.Diagnostics.dotMemory\release_net8.0\BenchmarkDotNet.Diagnostics.dotMemory.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\src\BenchmarkDotNet.Diagnostics.dotMemory\BenchmarkDotNet.Diagnostics.dotMemory.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.Static\release_net8.0\BenchmarkDotNet.IntegrationTests.Static.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.Static\BenchmarkDotNet.IntegrationTests.Static.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.EnabledOptimizations\release_net8.0\BenchmarkDotNet.IntegrationTests.EnabledOptimizations.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.EnabledOptimizations\BenchmarkDotNet.IntegrationTests.EnabledOptimizations.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.DisabledOptimizations\release_net8.0\BenchmarkDotNet.IntegrationTests.DisabledOptimizations.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.DisabledOptimizations\BenchmarkDotNet.IntegrationTests.DisabledOptimizations.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly\release_net8.0\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly.csproj::TargetFramework=net8.0]

It does work with a minimal project (including main.js path).
The main.js error seems to only happen in the integration tests...

I'll see if i can fix this tomorrow.

@FreyLuis
FreyLuis marked this pull request as ready for review February 24, 2026 21:53
@FreyLuis

FreyLuis commented Feb 24, 2026

Copy link
Copy Markdown
ContributorAuthor

@timcassell It works now.

The IntigrationTests still fail while building the dllgatherer on windows on my pc, but i couldn't reproduce it on another machine or with another project.

Like I wrote in the description, this does remove the --wasmDataDir argument and breaks the current state of dotnet/performance. There is already a PR that removes it.

I've noticed an odd behavior that I did not want to touch: When I set KeepBenchmarkFiles to true and build the project twice, it references all dlls from the previous build. I'm not sure if BenchmarkDotNet should delete the dlls before reusing the folder or build in another folder instead.

@timcassell

Copy link
Copy Markdown
Collaborator

The IntigrationTests still fail while building the dllgatherer on windows on my pc, but i couldn't reproduce it on another machine or with another project.

What's the error?

I've noticed an odd behavior that I did not want to touch: When I set KeepBenchmarkFiles to true and build the project twice, it references all dlls from the previous build. I'm not sure if BenchmarkDotNet should delete the dlls before reusing the folder or build in another folder instead.

KeepBenchmarkFiles is intended for debugging. The user is expected to delete it before running benchmarks again. I don't think we need to do anything about it.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

What's the error?

 // start dotnet build "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj" -f net8.0 -c Release --no-restore --no-dependencies --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true -bl:BenchmarkDotNet.IntegrationTests-1-build-no-restore-no-deps.binlog in C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1
C:\Users\luis\.nuget\packages\verify\31.12.5\buildTransitive\Verify.props(70,5): warning : No solution files found. Unable to auto-discover SolutionDir and SolutionName. Verify searches for .slnx and .sln files in the project directory 'C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1', parent directory, and parent's parent directory. To resolve this, either add a solution file to one of these locations, or explicitly set SolutionDir and SolutionName via command line: /p:SolutionDir="C:\Path\To\Solution\" /p:SolutionName="MySolution" [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
BenchmarkDotNet.Autogenerated -> C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1.dll
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
Build FAILED.
C:\Users\luis\.nuget\packages\verify\31.12.5\buildTransitive\Verify.props(70,5): warning : No solution files found. Unable to auto-discover SolutionDir and SolutionName. Verify searches for .slnx and .sln files in the project directory 'C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1', parent directory, and parent's parent directory. To resolve this, either add a solution file to one of these locations, or explicitly set SolutionDir and SolutionName via command line: /p:SolutionDir="C:\Path\To\Solution\" /p:SolutionName="MySolution" [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
1 Warning(s)
6 Error(s)
Time Elapsed 00:00:39.44

Looks like the error happened while building BenchmarkDotNet.Autogenerated. The dllgatherer only crashed because I didn't build the project before running the IntigrationTests. All those files do exist.

BenchmarkDotNet.IntegrationTests-1-build-no-restore-no-deps.binlog.zip

@timcassell

Copy link
Copy Markdown
Collaborator

Looks like there's a merge conflict.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

Looks like there's a merge conflict.

Should be fixed now.

https://github.com/twobrainsgmbh/BenchmarkDotNet/actions/runs/22404078490

Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmGenerator.cs Outdated
<WasmTargetsPath>$([System.IO.Path]::ChangeExtension('$(OriginalCSProjPath)', '.Wasm.targets'))</WasmTargetsPath>
<WasmDataDir>$WASMDATADIR$</WasmDataDir>
<WasmDataDir Condition="'$(WasmDataDir)' != ''">$([MSBuild]::NormalizeDirectory($(WasmDataDir)))</WasmDataDir>
<WasmMainJSPath>$MAINJS$</WasmMainJSPath>

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ilonatommy You recently changed away from this property, what are your thoughts here?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, it should work for publish.

Comment threadsrc/BenchmarkDotNet/Helpers/ProcessHelper.cs
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmToolchain.cs Outdated
Comment threadsrc/BenchmarkDotNet/ConsoleArguments/ConfigParser.cs Outdated
Comment threadsrc/BenchmarkDotNet/Environments/Runtimes/WasmRuntime.cs Outdated
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmToolchain.cs Outdated
@timcasselltimcassell linked an issue Feb 27, 2026 that may be closed by this pull request
@timcassell

Copy link
Copy Markdown
Collaborator

@pavelsavarapavelsavara left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, but wait for Ilona's review

Comment threadsrc/BenchmarkDotNet/Templates/benchmark-main.mjs Outdated
Comment threadtests/BenchmarkDotNet.IntegrationTests/WasmTests.cs
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmGenerator.cs Outdated
Comment threadsrc/BenchmarkDotNet/ConsoleArguments/CommandLineOptions.cs Outdated
Comment threadsrc/BenchmarkDotNet/Environments/Runtimes/WasmRuntime.cs Outdated
FreyLuisand others added 2 commits March 1, 2026 21:34
Co-authored-by: Tim Cassell <cassell.timothy@gmail.com>
Co-authored-by: Tim Cassell <cassell.timothy@gmail.com>
<WasmTargetsPath>$([System.IO.Path]::ChangeExtension('$(OriginalCSProjPath)', '.Wasm.targets'))</WasmTargetsPath>
<WasmDataDir>$WASMDATADIR$</WasmDataDir>
<WasmDataDir Condition="'$(WasmDataDir)' != ''">$([MSBuild]::NormalizeDirectory($(WasmDataDir)))</WasmDataDir>
<WasmMainJSPath>$MAINJS$</WasmMainJSPath>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, it should work for publish.

=> HashCode.Combine(base.GetHashCode(), JavaScriptEngine, JavaScriptEngineArguments, Aot, RuntimeFlavor);
=> HashCode.Combine(base.GetHashCode(), JavaScriptEngine, JavaScriptEngineArguments, JavaScriptEngineArgumentFormatter, IsAOT, RuntimeFlavor, ProcessTimeoutMinutes);

private static string DefaultArgumentFormatter(WasmRuntime runtime, ArtifactsPaths artifactsPaths, string args)

@ilonatommyilonatommyMar 2, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will it be coupled with a PR in perf repo? This formatter introduces double --module for v8 currently.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I've prepared a branch that removes --module as an argument.

FreyLuis/dotnet-performance@2b67d2f

@timcasselltimcassell left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @FreyLuis

@timcassell
timcassell merged commit 79a28f2 into dotnet:masterMar 2, 2026
11 checks passed
@timcasselltimcassell added this to the v0.16.0 milestone Mar 2, 2026
@FreyLuis
FreyLuis deleted the improve-wasm branch March 2, 2026 19:51
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

improve wasm support

4 participants

@FreyLuis@timcassell@pavelsavara@ilonatommy
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

improve wasm support - #3020

Merged
timcassell merged 15 commits into
dotnet:masterfrom
twobrainsgmbh:improve-wasm
Mar 2, 2026
Merged

improve wasm support#3020
timcassell merged 15 commits into
dotnet:masterfrom
twobrainsgmbh:improve-wasm

Conversation

@FreyLuis

@FreyLuisFreyLuis commented Feb 22, 2026

Copy link
Copy Markdown
Contributor

This PR aims to improve WASM support (as described in #2890) in a few ways:

  • Benchmarking WASM on Windows is now supported.
  • Running on node.js is now supported.
  • The JavaScriptEngine now resolves executables from the PATH.
  • A new mainJsTemplatePath option allows customizing the startup script (with polyfill, for example).
  • Removed unnecessary --wasmDataDir option, that was used by dotnet/performance to set WasmMainJSPath.
  • Removed outdated--expose_wasm as default args for javaScriptEngineArguments.
  • run-selected-tests pipeline fixed with wasm

AOT currently fails because the unit tests set only MonoAotCompilerMode and not the WasmRuntimes aot option. I've fixed the test and disabled it for now.

@FreyLuisFreyLuis changed the title Improve wasmimprove wasm supportFeb 22, 2026
@timcassell

Copy link
Copy Markdown
Collaborator

AOT currently fails because the unit tests set only MonoAotCompilerMode and not the WasmRuntimes aot option. I've fixed the test and disabled it for now.

Looking at the code, WasmRuntime.Aot isn't actually used. The toolchain passes aot: netCoreAppSettings.AOTCompilerMode == MonoAotLLVM.MonoAotCompilerMode.wasm to the generator. If the tests are failing, it's due to your changes. They should not be disabled.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

Looking at the code, WasmRuntime.Aot isn't actually used. The toolchain passes aot: netCoreAppSettings.AOTCompilerMode == MonoAotLLVM.MonoAotCompilerMode.wasm to the generator.

It is used right here which then sets the RunAOTCompilation flag.

I have a ci run without the last commit on main, that worked. It seems like the switch to the Microsoft.NET.Sdk.WebAssembly causes some issues with my changes. I'll see if i can fix that later.

Comment threadtests/BenchmarkDotNet.IntegrationTests/WasmTests.cs Outdated
@timcassell

Copy link
Copy Markdown
Collaborator

It is used right here which then sets the RunAOTCompilation flag.

Oh, duh, not sure how I missed that. What a mess, that could use some cleanup, too. So the test was never actually testing aot.

@timcassell

Copy link
Copy Markdown
Collaborator

I have a ci run without the last commit on main, that worked. It seems like the switch to the Microsoft.NET.Sdk.WebAssembly causes some issues with my changes. I'll see if i can fix that later.

Maybe the wwwroot is necessary? I also have a green CI run where I had it running on node, with minimal other changes to the toolchain (besides the async refactor and mjs changes for websocket).

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

I don't know why the build doesn't fail in the ci, it crashes on my windows machine with the following errors:

 C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.FSharp\release_net8.0\BenchmarkDotNet.IntegrationTests.FSharp.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.FSharp\BenchmarkDotNet.IntegrationTests.FSharp.fsproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.VisualBasic\release_net8.0\BenchmarkDotNet.IntegrationTests.VisualBasic.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.VisualBasic\BenchmarkDotNet.IntegrationTests.VisualBasic.vbproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.Diagnostics.dotTrace\release_net8.0\BenchmarkDotNet.Diagnostics.dotTrace.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\src\BenchmarkDotNet.Diagnostics.dotTrace\BenchmarkDotNet.Diagnostics.dotTrace.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.Diagnostics.dotMemory\release_net8.0\BenchmarkDotNet.Diagnostics.dotMemory.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\src\BenchmarkDotNet.Diagnostics.dotMemory\BenchmarkDotNet.Diagnostics.dotMemory.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.Static\release_net8.0\BenchmarkDotNet.IntegrationTests.Static.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.Static\BenchmarkDotNet.IntegrationTests.Static.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.EnabledOptimizations\release_net8.0\BenchmarkDotNet.IntegrationTests.EnabledOptimizations.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.EnabledOptimizations\BenchmarkDotNet.IntegrationTests.EnabledOptimizations.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.DisabledOptimizations\release_net8.0\BenchmarkDotNet.IntegrationTests.DisabledOptimizations.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.DisabledOptimizations\BenchmarkDotNet.IntegrationTests.DisabledOptimizations.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly\release_net8.0\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly.csproj::TargetFramework=net8.0]

It does work with a minimal project (including main.js path).
The main.js error seems to only happen in the integration tests...

I'll see if i can fix this tomorrow.

@FreyLuis
FreyLuis marked this pull request as ready for review February 24, 2026 21:53
@FreyLuis

FreyLuis commented Feb 24, 2026

Copy link
Copy Markdown
ContributorAuthor

@timcassell It works now.

The IntigrationTests still fail while building the dllgatherer on windows on my pc, but i couldn't reproduce it on another machine or with another project.

Like I wrote in the description, this does remove the --wasmDataDir argument and breaks the current state of dotnet/performance. There is already a PR that removes it.

I've noticed an odd behavior that I did not want to touch: When I set KeepBenchmarkFiles to true and build the project twice, it references all dlls from the previous build. I'm not sure if BenchmarkDotNet should delete the dlls before reusing the folder or build in another folder instead.

@timcassell

Copy link
Copy Markdown
Collaborator

The IntigrationTests still fail while building the dllgatherer on windows on my pc, but i couldn't reproduce it on another machine or with another project.

What's the error?

I've noticed an odd behavior that I did not want to touch: When I set KeepBenchmarkFiles to true and build the project twice, it references all dlls from the previous build. I'm not sure if BenchmarkDotNet should delete the dlls before reusing the folder or build in another folder instead.

KeepBenchmarkFiles is intended for debugging. The user is expected to delete it before running benchmarks again. I don't think we need to do anything about it.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

What's the error?

 // start dotnet build "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj" -f net8.0 -c Release --no-restore --no-dependencies --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true -bl:BenchmarkDotNet.IntegrationTests-1-build-no-restore-no-deps.binlog in C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1
C:\Users\luis\.nuget\packages\verify\31.12.5\buildTransitive\Verify.props(70,5): warning : No solution files found. Unable to auto-discover SolutionDir and SolutionName. Verify searches for .slnx and .sln files in the project directory 'C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1', parent directory, and parent's parent directory. To resolve this, either add a solution file to one of these locations, or explicitly set SolutionDir and SolutionName via command line: /p:SolutionDir="C:\Path\To\Solution\" /p:SolutionName="MySolution" [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
BenchmarkDotNet.Autogenerated -> C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1.dll
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
Build FAILED.
C:\Users\luis\.nuget\packages\verify\31.12.5\buildTransitive\Verify.props(70,5): warning : No solution files found. Unable to auto-discover SolutionDir and SolutionName. Verify searches for .slnx and .sln files in the project directory 'C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1', parent directory, and parent's parent directory. To resolve this, either add a solution file to one of these locations, or explicitly set SolutionDir and SolutionName via command line: /p:SolutionDir="C:\Path\To\Solution\" /p:SolutionName="MySolution" [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
1 Warning(s)
6 Error(s)
Time Elapsed 00:00:39.44

Looks like the error happened while building BenchmarkDotNet.Autogenerated. The dllgatherer only crashed because I didn't build the project before running the IntigrationTests. All those files do exist.

BenchmarkDotNet.IntegrationTests-1-build-no-restore-no-deps.binlog.zip

@timcassell

Copy link
Copy Markdown
Collaborator

Looks like there's a merge conflict.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

Looks like there's a merge conflict.

Should be fixed now.

https://github.com/twobrainsgmbh/BenchmarkDotNet/actions/runs/22404078490

Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmGenerator.cs Outdated
<WasmTargetsPath>$([System.IO.Path]::ChangeExtension('$(OriginalCSProjPath)', '.Wasm.targets'))</WasmTargetsPath>
<WasmDataDir>$WASMDATADIR$</WasmDataDir>
<WasmDataDir Condition="'$(WasmDataDir)' != ''">$([MSBuild]::NormalizeDirectory($(WasmDataDir)))</WasmDataDir>
<WasmMainJSPath>$MAINJS$</WasmMainJSPath>

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ilonatommy You recently changed away from this property, what are your thoughts here?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, it should work for publish.

Comment threadsrc/BenchmarkDotNet/Helpers/ProcessHelper.cs
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmToolchain.cs Outdated
Comment threadsrc/BenchmarkDotNet/ConsoleArguments/ConfigParser.cs Outdated
Comment threadsrc/BenchmarkDotNet/Environments/Runtimes/WasmRuntime.cs Outdated
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmToolchain.cs Outdated
@timcasselltimcassell linked an issue Feb 27, 2026 that may be closed by this pull request
@timcassell

Copy link
Copy Markdown
Collaborator

@pavelsavarapavelsavara left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, but wait for Ilona's review

Comment threadsrc/BenchmarkDotNet/Templates/benchmark-main.mjs Outdated
Comment threadtests/BenchmarkDotNet.IntegrationTests/WasmTests.cs
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmGenerator.cs Outdated
Comment threadsrc/BenchmarkDotNet/ConsoleArguments/CommandLineOptions.cs Outdated
Comment threadsrc/BenchmarkDotNet/Environments/Runtimes/WasmRuntime.cs Outdated
FreyLuisand others added 2 commits March 1, 2026 21:34
Co-authored-by: Tim Cassell <cassell.timothy@gmail.com>
Co-authored-by: Tim Cassell <cassell.timothy@gmail.com>
<WasmTargetsPath>$([System.IO.Path]::ChangeExtension('$(OriginalCSProjPath)', '.Wasm.targets'))</WasmTargetsPath>
<WasmDataDir>$WASMDATADIR$</WasmDataDir>
<WasmDataDir Condition="'$(WasmDataDir)' != ''">$([MSBuild]::NormalizeDirectory($(WasmDataDir)))</WasmDataDir>
<WasmMainJSPath>$MAINJS$</WasmMainJSPath>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, it should work for publish.

=> HashCode.Combine(base.GetHashCode(), JavaScriptEngine, JavaScriptEngineArguments, Aot, RuntimeFlavor);
=> HashCode.Combine(base.GetHashCode(), JavaScriptEngine, JavaScriptEngineArguments, JavaScriptEngineArgumentFormatter, IsAOT, RuntimeFlavor, ProcessTimeoutMinutes);

private static string DefaultArgumentFormatter(WasmRuntime runtime, ArtifactsPaths artifactsPaths, string args)

@ilonatommyilonatommyMar 2, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will it be coupled with a PR in perf repo? This formatter introduces double --module for v8 currently.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I've prepared a branch that removes --module as an argument.

FreyLuis/dotnet-performance@2b67d2f

@timcasselltimcassell left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @FreyLuis

@timcassell
timcassell merged commit 79a28f2 into dotnet:masterMar 2, 2026
11 checks passed
@timcasselltimcassell added this to the v0.16.0 milestone Mar 2, 2026
@FreyLuis
FreyLuis deleted the improve-wasm branch March 2, 2026 19:51
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

improve wasm support

4 participants

@FreyLuis@timcassell@pavelsavara@ilonatommy
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

improve wasm support - #3020

Merged
timcassell merged 15 commits into
dotnet:masterfrom
twobrainsgmbh:improve-wasm
Mar 2, 2026
Merged

improve wasm support#3020
timcassell merged 15 commits into
dotnet:masterfrom
twobrainsgmbh:improve-wasm

Conversation

@FreyLuis

@FreyLuisFreyLuis commented Feb 22, 2026

Copy link
Copy Markdown
Contributor

This PR aims to improve WASM support (as described in #2890) in a few ways:

  • Benchmarking WASM on Windows is now supported.
  • Running on node.js is now supported.
  • The JavaScriptEngine now resolves executables from the PATH.
  • A new mainJsTemplatePath option allows customizing the startup script (with polyfill, for example).
  • Removed unnecessary --wasmDataDir option, that was used by dotnet/performance to set WasmMainJSPath.
  • Removed outdated--expose_wasm as default args for javaScriptEngineArguments.
  • run-selected-tests pipeline fixed with wasm

AOT currently fails because the unit tests set only MonoAotCompilerMode and not the WasmRuntimes aot option. I've fixed the test and disabled it for now.

@FreyLuisFreyLuis changed the title Improve wasmimprove wasm supportFeb 22, 2026
@timcassell

Copy link
Copy Markdown
Collaborator

AOT currently fails because the unit tests set only MonoAotCompilerMode and not the WasmRuntimes aot option. I've fixed the test and disabled it for now.

Looking at the code, WasmRuntime.Aot isn't actually used. The toolchain passes aot: netCoreAppSettings.AOTCompilerMode == MonoAotLLVM.MonoAotCompilerMode.wasm to the generator. If the tests are failing, it's due to your changes. They should not be disabled.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

Looking at the code, WasmRuntime.Aot isn't actually used. The toolchain passes aot: netCoreAppSettings.AOTCompilerMode == MonoAotLLVM.MonoAotCompilerMode.wasm to the generator.

It is used right here which then sets the RunAOTCompilation flag.

I have a ci run without the last commit on main, that worked. It seems like the switch to the Microsoft.NET.Sdk.WebAssembly causes some issues with my changes. I'll see if i can fix that later.

Comment threadtests/BenchmarkDotNet.IntegrationTests/WasmTests.cs Outdated
@timcassell

Copy link
Copy Markdown
Collaborator

It is used right here which then sets the RunAOTCompilation flag.

Oh, duh, not sure how I missed that. What a mess, that could use some cleanup, too. So the test was never actually testing aot.

@timcassell

Copy link
Copy Markdown
Collaborator

I have a ci run without the last commit on main, that worked. It seems like the switch to the Microsoft.NET.Sdk.WebAssembly causes some issues with my changes. I'll see if i can fix that later.

Maybe the wwwroot is necessary? I also have a green CI run where I had it running on node, with minimal other changes to the toolchain (besides the async refactor and mjs changes for websocket).

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

I don't know why the build doesn't fail in the ci, it crashes on my windows machine with the following errors:

 C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.FSharp\release_net8.0\BenchmarkDotNet.IntegrationTests.FSharp.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.FSharp\BenchmarkDotNet.IntegrationTests.FSharp.fsproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.VisualBasic\release_net8.0\BenchmarkDotNet.IntegrationTests.VisualBasic.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.VisualBasic\BenchmarkDotNet.IntegrationTests.VisualBasic.vbproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.Diagnostics.dotTrace\release_net8.0\BenchmarkDotNet.Diagnostics.dotTrace.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\src\BenchmarkDotNet.Diagnostics.dotTrace\BenchmarkDotNet.Diagnostics.dotTrace.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.Diagnostics.dotMemory\release_net8.0\BenchmarkDotNet.Diagnostics.dotMemory.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\src\BenchmarkDotNet.Diagnostics.dotMemory\BenchmarkDotNet.Diagnostics.dotMemory.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.Static\release_net8.0\BenchmarkDotNet.IntegrationTests.Static.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.Static\BenchmarkDotNet.IntegrationTests.Static.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.EnabledOptimizations\release_net8.0\BenchmarkDotNet.IntegrationTests.EnabledOptimizations.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.EnabledOptimizations\BenchmarkDotNet.IntegrationTests.EnabledOptimizations.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.DisabledOptimizations\release_net8.0\BenchmarkDotNet.IntegrationTests.DisabledOptimizations.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.DisabledOptimizations\BenchmarkDotNet.IntegrationTests.DisabledOptimizations.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly\release_net8.0\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly.csproj::TargetFramework=net8.0]

It does work with a minimal project (including main.js path).
The main.js error seems to only happen in the integration tests...

I'll see if i can fix this tomorrow.

@FreyLuis
FreyLuis marked this pull request as ready for review February 24, 2026 21:53
@FreyLuis

FreyLuis commented Feb 24, 2026

Copy link
Copy Markdown
ContributorAuthor

@timcassell It works now.

The IntigrationTests still fail while building the dllgatherer on windows on my pc, but i couldn't reproduce it on another machine or with another project.

Like I wrote in the description, this does remove the --wasmDataDir argument and breaks the current state of dotnet/performance. There is already a PR that removes it.

I've noticed an odd behavior that I did not want to touch: When I set KeepBenchmarkFiles to true and build the project twice, it references all dlls from the previous build. I'm not sure if BenchmarkDotNet should delete the dlls before reusing the folder or build in another folder instead.

@timcassell

Copy link
Copy Markdown
Collaborator

The IntigrationTests still fail while building the dllgatherer on windows on my pc, but i couldn't reproduce it on another machine or with another project.

What's the error?

I've noticed an odd behavior that I did not want to touch: When I set KeepBenchmarkFiles to true and build the project twice, it references all dlls from the previous build. I'm not sure if BenchmarkDotNet should delete the dlls before reusing the folder or build in another folder instead.

KeepBenchmarkFiles is intended for debugging. The user is expected to delete it before running benchmarks again. I don't think we need to do anything about it.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

What's the error?

 // start dotnet build "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj" -f net8.0 -c Release --no-restore --no-dependencies --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true -bl:BenchmarkDotNet.IntegrationTests-1-build-no-restore-no-deps.binlog in C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1
C:\Users\luis\.nuget\packages\verify\31.12.5\buildTransitive\Verify.props(70,5): warning : No solution files found. Unable to auto-discover SolutionDir and SolutionName. Verify searches for .slnx and .sln files in the project directory 'C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1', parent directory, and parent's parent directory. To resolve this, either add a solution file to one of these locations, or explicitly set SolutionDir and SolutionName via command line: /p:SolutionDir="C:\Path\To\Solution\" /p:SolutionName="MySolution" [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
BenchmarkDotNet.Autogenerated -> C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1.dll
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
Build FAILED.
C:\Users\luis\.nuget\packages\verify\31.12.5\buildTransitive\Verify.props(70,5): warning : No solution files found. Unable to auto-discover SolutionDir and SolutionName. Verify searches for .slnx and .sln files in the project directory 'C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1', parent directory, and parent's parent directory. To resolve this, either add a solution file to one of these locations, or explicitly set SolutionDir and SolutionName via command line: /p:SolutionDir="C:\Path\To\Solution\" /p:SolutionName="MySolution" [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
1 Warning(s)
6 Error(s)
Time Elapsed 00:00:39.44

Looks like the error happened while building BenchmarkDotNet.Autogenerated. The dllgatherer only crashed because I didn't build the project before running the IntigrationTests. All those files do exist.

BenchmarkDotNet.IntegrationTests-1-build-no-restore-no-deps.binlog.zip

@timcassell

Copy link
Copy Markdown
Collaborator

Looks like there's a merge conflict.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

Looks like there's a merge conflict.

Should be fixed now.

https://github.com/twobrainsgmbh/BenchmarkDotNet/actions/runs/22404078490

Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmGenerator.cs Outdated
<WasmTargetsPath>$([System.IO.Path]::ChangeExtension('$(OriginalCSProjPath)', '.Wasm.targets'))</WasmTargetsPath>
<WasmDataDir>$WASMDATADIR$</WasmDataDir>
<WasmDataDir Condition="'$(WasmDataDir)' != ''">$([MSBuild]::NormalizeDirectory($(WasmDataDir)))</WasmDataDir>
<WasmMainJSPath>$MAINJS$</WasmMainJSPath>

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ilonatommy You recently changed away from this property, what are your thoughts here?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, it should work for publish.

Comment threadsrc/BenchmarkDotNet/Helpers/ProcessHelper.cs
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmToolchain.cs Outdated
Comment threadsrc/BenchmarkDotNet/ConsoleArguments/ConfigParser.cs Outdated
Comment threadsrc/BenchmarkDotNet/Environments/Runtimes/WasmRuntime.cs Outdated
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmToolchain.cs Outdated
@timcasselltimcassell linked an issue Feb 27, 2026 that may be closed by this pull request
@timcassell

Copy link
Copy Markdown
Collaborator

@pavelsavarapavelsavara left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, but wait for Ilona's review

Comment threadsrc/BenchmarkDotNet/Templates/benchmark-main.mjs Outdated
Comment threadtests/BenchmarkDotNet.IntegrationTests/WasmTests.cs
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmGenerator.cs Outdated
Comment threadsrc/BenchmarkDotNet/ConsoleArguments/CommandLineOptions.cs Outdated
Comment threadsrc/BenchmarkDotNet/Environments/Runtimes/WasmRuntime.cs Outdated
FreyLuisand others added 2 commits March 1, 2026 21:34
Co-authored-by: Tim Cassell <cassell.timothy@gmail.com>
Co-authored-by: Tim Cassell <cassell.timothy@gmail.com>
<WasmTargetsPath>$([System.IO.Path]::ChangeExtension('$(OriginalCSProjPath)', '.Wasm.targets'))</WasmTargetsPath>
<WasmDataDir>$WASMDATADIR$</WasmDataDir>
<WasmDataDir Condition="'$(WasmDataDir)' != ''">$([MSBuild]::NormalizeDirectory($(WasmDataDir)))</WasmDataDir>
<WasmMainJSPath>$MAINJS$</WasmMainJSPath>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, it should work for publish.

=> HashCode.Combine(base.GetHashCode(), JavaScriptEngine, JavaScriptEngineArguments, Aot, RuntimeFlavor);
=> HashCode.Combine(base.GetHashCode(), JavaScriptEngine, JavaScriptEngineArguments, JavaScriptEngineArgumentFormatter, IsAOT, RuntimeFlavor, ProcessTimeoutMinutes);

private static string DefaultArgumentFormatter(WasmRuntime runtime, ArtifactsPaths artifactsPaths, string args)

@ilonatommyilonatommyMar 2, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will it be coupled with a PR in perf repo? This formatter introduces double --module for v8 currently.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I've prepared a branch that removes --module as an argument.

FreyLuis/dotnet-performance@2b67d2f

@timcasselltimcassell left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @FreyLuis

@timcassell
timcassell merged commit 79a28f2 into dotnet:masterMar 2, 2026
11 checks passed
@timcasselltimcassell added this to the v0.16.0 milestone Mar 2, 2026
@FreyLuis
FreyLuis deleted the improve-wasm branch March 2, 2026 19:51
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

improve wasm support

4 participants

@FreyLuis@timcassell@pavelsavara@ilonatommy
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

improve wasm support - #3020

Merged
timcassell merged 15 commits into
dotnet:masterfrom
twobrainsgmbh:improve-wasm
Mar 2, 2026
Merged

improve wasm support#3020
timcassell merged 15 commits into
dotnet:masterfrom
twobrainsgmbh:improve-wasm

Conversation

@FreyLuis

@FreyLuisFreyLuis commented Feb 22, 2026

Copy link
Copy Markdown
Contributor

This PR aims to improve WASM support (as described in #2890) in a few ways:

  • Benchmarking WASM on Windows is now supported.
  • Running on node.js is now supported.
  • The JavaScriptEngine now resolves executables from the PATH.
  • A new mainJsTemplatePath option allows customizing the startup script (with polyfill, for example).
  • Removed unnecessary --wasmDataDir option, that was used by dotnet/performance to set WasmMainJSPath.
  • Removed outdated--expose_wasm as default args for javaScriptEngineArguments.
  • run-selected-tests pipeline fixed with wasm

AOT currently fails because the unit tests set only MonoAotCompilerMode and not the WasmRuntimes aot option. I've fixed the test and disabled it for now.

@FreyLuisFreyLuis changed the title Improve wasmimprove wasm supportFeb 22, 2026
@timcassell

Copy link
Copy Markdown
Collaborator

AOT currently fails because the unit tests set only MonoAotCompilerMode and not the WasmRuntimes aot option. I've fixed the test and disabled it for now.

Looking at the code, WasmRuntime.Aot isn't actually used. The toolchain passes aot: netCoreAppSettings.AOTCompilerMode == MonoAotLLVM.MonoAotCompilerMode.wasm to the generator. If the tests are failing, it's due to your changes. They should not be disabled.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

Looking at the code, WasmRuntime.Aot isn't actually used. The toolchain passes aot: netCoreAppSettings.AOTCompilerMode == MonoAotLLVM.MonoAotCompilerMode.wasm to the generator.

It is used right here which then sets the RunAOTCompilation flag.

I have a ci run without the last commit on main, that worked. It seems like the switch to the Microsoft.NET.Sdk.WebAssembly causes some issues with my changes. I'll see if i can fix that later.

Comment threadtests/BenchmarkDotNet.IntegrationTests/WasmTests.cs Outdated
@timcassell

Copy link
Copy Markdown
Collaborator

It is used right here which then sets the RunAOTCompilation flag.

Oh, duh, not sure how I missed that. What a mess, that could use some cleanup, too. So the test was never actually testing aot.

@timcassell

Copy link
Copy Markdown
Collaborator

I have a ci run without the last commit on main, that worked. It seems like the switch to the Microsoft.NET.Sdk.WebAssembly causes some issues with my changes. I'll see if i can fix that later.

Maybe the wwwroot is necessary? I also have a green CI run where I had it running on node, with minimal other changes to the toolchain (besides the async refactor and mjs changes for websocket).

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

I don't know why the build doesn't fail in the ci, it crashes on my windows machine with the following errors:

 C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.FSharp\release_net8.0\BenchmarkDotNet.IntegrationTests.FSharp.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.FSharp\BenchmarkDotNet.IntegrationTests.FSharp.fsproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.VisualBasic\release_net8.0\BenchmarkDotNet.IntegrationTests.VisualBasic.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.VisualBasic\BenchmarkDotNet.IntegrationTests.VisualBasic.vbproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.Diagnostics.dotTrace\release_net8.0\BenchmarkDotNet.Diagnostics.dotTrace.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\src\BenchmarkDotNet.Diagnostics.dotTrace\BenchmarkDotNet.Diagnostics.dotTrace.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.Diagnostics.dotMemory\release_net8.0\BenchmarkDotNet.Diagnostics.dotMemory.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\src\BenchmarkDotNet.Diagnostics.dotMemory\BenchmarkDotNet.Diagnostics.dotMemory.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.Static\release_net8.0\BenchmarkDotNet.IntegrationTests.Static.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.Static\BenchmarkDotNet.IntegrationTests.Static.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.EnabledOptimizations\release_net8.0\BenchmarkDotNet.IntegrationTests.EnabledOptimizations.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.EnabledOptimizations\BenchmarkDotNet.IntegrationTests.EnabledOptimizations.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.DisabledOptimizations\release_net8.0\BenchmarkDotNet.IntegrationTests.DisabledOptimizations.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.DisabledOptimizations\BenchmarkDotNet.IntegrationTests.DisabledOptimizations.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly\release_net8.0\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly.csproj::TargetFramework=net8.0]

It does work with a minimal project (including main.js path).
The main.js error seems to only happen in the integration tests...

I'll see if i can fix this tomorrow.

@FreyLuis
FreyLuis marked this pull request as ready for review February 24, 2026 21:53
@FreyLuis

FreyLuis commented Feb 24, 2026

Copy link
Copy Markdown
ContributorAuthor

@timcassell It works now.

The IntigrationTests still fail while building the dllgatherer on windows on my pc, but i couldn't reproduce it on another machine or with another project.

Like I wrote in the description, this does remove the --wasmDataDir argument and breaks the current state of dotnet/performance. There is already a PR that removes it.

I've noticed an odd behavior that I did not want to touch: When I set KeepBenchmarkFiles to true and build the project twice, it references all dlls from the previous build. I'm not sure if BenchmarkDotNet should delete the dlls before reusing the folder or build in another folder instead.

@timcassell

Copy link
Copy Markdown
Collaborator

The IntigrationTests still fail while building the dllgatherer on windows on my pc, but i couldn't reproduce it on another machine or with another project.

What's the error?

I've noticed an odd behavior that I did not want to touch: When I set KeepBenchmarkFiles to true and build the project twice, it references all dlls from the previous build. I'm not sure if BenchmarkDotNet should delete the dlls before reusing the folder or build in another folder instead.

KeepBenchmarkFiles is intended for debugging. The user is expected to delete it before running benchmarks again. I don't think we need to do anything about it.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

What's the error?

 // start dotnet build "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj" -f net8.0 -c Release --no-restore --no-dependencies --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true -bl:BenchmarkDotNet.IntegrationTests-1-build-no-restore-no-deps.binlog in C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1
C:\Users\luis\.nuget\packages\verify\31.12.5\buildTransitive\Verify.props(70,5): warning : No solution files found. Unable to auto-discover SolutionDir and SolutionName. Verify searches for .slnx and .sln files in the project directory 'C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1', parent directory, and parent's parent directory. To resolve this, either add a solution file to one of these locations, or explicitly set SolutionDir and SolutionName via command line: /p:SolutionDir="C:\Path\To\Solution\" /p:SolutionName="MySolution" [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
BenchmarkDotNet.Autogenerated -> C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1.dll
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
Build FAILED.
C:\Users\luis\.nuget\packages\verify\31.12.5\buildTransitive\Verify.props(70,5): warning : No solution files found. Unable to auto-discover SolutionDir and SolutionName. Verify searches for .slnx and .sln files in the project directory 'C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1', parent directory, and parent's parent directory. To resolve this, either add a solution file to one of these locations, or explicitly set SolutionDir and SolutionName via command line: /p:SolutionDir="C:\Path\To\Solution\" /p:SolutionName="MySolution" [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
1 Warning(s)
6 Error(s)
Time Elapsed 00:00:39.44

Looks like the error happened while building BenchmarkDotNet.Autogenerated. The dllgatherer only crashed because I didn't build the project before running the IntigrationTests. All those files do exist.

BenchmarkDotNet.IntegrationTests-1-build-no-restore-no-deps.binlog.zip

@timcassell

Copy link
Copy Markdown
Collaborator

Looks like there's a merge conflict.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

Looks like there's a merge conflict.

Should be fixed now.

https://github.com/twobrainsgmbh/BenchmarkDotNet/actions/runs/22404078490

Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmGenerator.cs Outdated
<WasmTargetsPath>$([System.IO.Path]::ChangeExtension('$(OriginalCSProjPath)', '.Wasm.targets'))</WasmTargetsPath>
<WasmDataDir>$WASMDATADIR$</WasmDataDir>
<WasmDataDir Condition="'$(WasmDataDir)' != ''">$([MSBuild]::NormalizeDirectory($(WasmDataDir)))</WasmDataDir>
<WasmMainJSPath>$MAINJS$</WasmMainJSPath>

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ilonatommy You recently changed away from this property, what are your thoughts here?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, it should work for publish.

Comment threadsrc/BenchmarkDotNet/Helpers/ProcessHelper.cs
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmToolchain.cs Outdated
Comment threadsrc/BenchmarkDotNet/ConsoleArguments/ConfigParser.cs Outdated
Comment threadsrc/BenchmarkDotNet/Environments/Runtimes/WasmRuntime.cs Outdated
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmToolchain.cs Outdated
@timcasselltimcassell linked an issue Feb 27, 2026 that may be closed by this pull request
@timcassell

Copy link
Copy Markdown
Collaborator

@pavelsavarapavelsavara left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, but wait for Ilona's review

Comment threadsrc/BenchmarkDotNet/Templates/benchmark-main.mjs Outdated
Comment threadtests/BenchmarkDotNet.IntegrationTests/WasmTests.cs
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmGenerator.cs Outdated
Comment threadsrc/BenchmarkDotNet/ConsoleArguments/CommandLineOptions.cs Outdated
Comment threadsrc/BenchmarkDotNet/Environments/Runtimes/WasmRuntime.cs Outdated
FreyLuisand others added 2 commits March 1, 2026 21:34
Co-authored-by: Tim Cassell <cassell.timothy@gmail.com>
Co-authored-by: Tim Cassell <cassell.timothy@gmail.com>
<WasmTargetsPath>$([System.IO.Path]::ChangeExtension('$(OriginalCSProjPath)', '.Wasm.targets'))</WasmTargetsPath>
<WasmDataDir>$WASMDATADIR$</WasmDataDir>
<WasmDataDir Condition="'$(WasmDataDir)' != ''">$([MSBuild]::NormalizeDirectory($(WasmDataDir)))</WasmDataDir>
<WasmMainJSPath>$MAINJS$</WasmMainJSPath>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, it should work for publish.

=> HashCode.Combine(base.GetHashCode(), JavaScriptEngine, JavaScriptEngineArguments, Aot, RuntimeFlavor);
=> HashCode.Combine(base.GetHashCode(), JavaScriptEngine, JavaScriptEngineArguments, JavaScriptEngineArgumentFormatter, IsAOT, RuntimeFlavor, ProcessTimeoutMinutes);

private static string DefaultArgumentFormatter(WasmRuntime runtime, ArtifactsPaths artifactsPaths, string args)

@ilonatommyilonatommyMar 2, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will it be coupled with a PR in perf repo? This formatter introduces double --module for v8 currently.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I've prepared a branch that removes --module as an argument.

FreyLuis/dotnet-performance@2b67d2f

@timcasselltimcassell left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @FreyLuis

@timcassell
timcassell merged commit 79a28f2 into dotnet:masterMar 2, 2026
11 checks passed
@timcasselltimcassell added this to the v0.16.0 milestone Mar 2, 2026
@FreyLuis
FreyLuis deleted the improve-wasm branch March 2, 2026 19:51
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

improve wasm support

4 participants

@FreyLuis@timcassell@pavelsavara@ilonatommy
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

improve wasm support - #3020

Merged
timcassell merged 15 commits into
dotnet:masterfrom
twobrainsgmbh:improve-wasm
Mar 2, 2026
Merged

improve wasm support#3020
timcassell merged 15 commits into
dotnet:masterfrom
twobrainsgmbh:improve-wasm

Conversation

@FreyLuis

@FreyLuisFreyLuis commented Feb 22, 2026

Copy link
Copy Markdown
Contributor

This PR aims to improve WASM support (as described in #2890) in a few ways:

  • Benchmarking WASM on Windows is now supported.
  • Running on node.js is now supported.
  • The JavaScriptEngine now resolves executables from the PATH.
  • A new mainJsTemplatePath option allows customizing the startup script (with polyfill, for example).
  • Removed unnecessary --wasmDataDir option, that was used by dotnet/performance to set WasmMainJSPath.
  • Removed outdated--expose_wasm as default args for javaScriptEngineArguments.
  • run-selected-tests pipeline fixed with wasm

AOT currently fails because the unit tests set only MonoAotCompilerMode and not the WasmRuntimes aot option. I've fixed the test and disabled it for now.

@FreyLuisFreyLuis changed the title Improve wasmimprove wasm supportFeb 22, 2026
@timcassell

Copy link
Copy Markdown
Collaborator

AOT currently fails because the unit tests set only MonoAotCompilerMode and not the WasmRuntimes aot option. I've fixed the test and disabled it for now.

Looking at the code, WasmRuntime.Aot isn't actually used. The toolchain passes aot: netCoreAppSettings.AOTCompilerMode == MonoAotLLVM.MonoAotCompilerMode.wasm to the generator. If the tests are failing, it's due to your changes. They should not be disabled.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

Looking at the code, WasmRuntime.Aot isn't actually used. The toolchain passes aot: netCoreAppSettings.AOTCompilerMode == MonoAotLLVM.MonoAotCompilerMode.wasm to the generator.

It is used right here which then sets the RunAOTCompilation flag.

I have a ci run without the last commit on main, that worked. It seems like the switch to the Microsoft.NET.Sdk.WebAssembly causes some issues with my changes. I'll see if i can fix that later.

Comment threadtests/BenchmarkDotNet.IntegrationTests/WasmTests.cs Outdated
@timcassell

Copy link
Copy Markdown
Collaborator

It is used right here which then sets the RunAOTCompilation flag.

Oh, duh, not sure how I missed that. What a mess, that could use some cleanup, too. So the test was never actually testing aot.

@timcassell

Copy link
Copy Markdown
Collaborator

I have a ci run without the last commit on main, that worked. It seems like the switch to the Microsoft.NET.Sdk.WebAssembly causes some issues with my changes. I'll see if i can fix that later.

Maybe the wwwroot is necessary? I also have a green CI run where I had it running on node, with minimal other changes to the toolchain (besides the async refactor and mjs changes for websocket).

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

I don't know why the build doesn't fail in the ci, it crashes on my windows machine with the following errors:

 C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.FSharp\release_net8.0\BenchmarkDotNet.IntegrationTests.FSharp.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.FSharp\BenchmarkDotNet.IntegrationTests.FSharp.fsproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.VisualBasic\release_net8.0\BenchmarkDotNet.IntegrationTests.VisualBasic.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.VisualBasic\BenchmarkDotNet.IntegrationTests.VisualBasic.vbproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.Diagnostics.dotTrace\release_net8.0\BenchmarkDotNet.Diagnostics.dotTrace.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\src\BenchmarkDotNet.Diagnostics.dotTrace\BenchmarkDotNet.Diagnostics.dotTrace.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.Diagnostics.dotMemory\release_net8.0\BenchmarkDotNet.Diagnostics.dotMemory.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\src\BenchmarkDotNet.Diagnostics.dotMemory\BenchmarkDotNet.Diagnostics.dotMemory.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.Static\release_net8.0\BenchmarkDotNet.IntegrationTests.Static.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.Static\BenchmarkDotNet.IntegrationTests.Static.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.EnabledOptimizations\release_net8.0\BenchmarkDotNet.IntegrationTests.EnabledOptimizations.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.EnabledOptimizations\BenchmarkDotNet.IntegrationTests.EnabledOptimizations.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.DisabledOptimizations\release_net8.0\BenchmarkDotNet.IntegrationTests.DisabledOptimizations.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.DisabledOptimizations\BenchmarkDotNet.IntegrationTests.DisabledOptimizations.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly\release_net8.0\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly.csproj::TargetFramework=net8.0]

It does work with a minimal project (including main.js path).
The main.js error seems to only happen in the integration tests...

I'll see if i can fix this tomorrow.

@FreyLuis
FreyLuis marked this pull request as ready for review February 24, 2026 21:53
@FreyLuis

FreyLuis commented Feb 24, 2026

Copy link
Copy Markdown
ContributorAuthor

@timcassell It works now.

The IntigrationTests still fail while building the dllgatherer on windows on my pc, but i couldn't reproduce it on another machine or with another project.

Like I wrote in the description, this does remove the --wasmDataDir argument and breaks the current state of dotnet/performance. There is already a PR that removes it.

I've noticed an odd behavior that I did not want to touch: When I set KeepBenchmarkFiles to true and build the project twice, it references all dlls from the previous build. I'm not sure if BenchmarkDotNet should delete the dlls before reusing the folder or build in another folder instead.

@timcassell

Copy link
Copy Markdown
Collaborator

The IntigrationTests still fail while building the dllgatherer on windows on my pc, but i couldn't reproduce it on another machine or with another project.

What's the error?

I've noticed an odd behavior that I did not want to touch: When I set KeepBenchmarkFiles to true and build the project twice, it references all dlls from the previous build. I'm not sure if BenchmarkDotNet should delete the dlls before reusing the folder or build in another folder instead.

KeepBenchmarkFiles is intended for debugging. The user is expected to delete it before running benchmarks again. I don't think we need to do anything about it.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

What's the error?

 // start dotnet build "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj" -f net8.0 -c Release --no-restore --no-dependencies --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true -bl:BenchmarkDotNet.IntegrationTests-1-build-no-restore-no-deps.binlog in C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1
C:\Users\luis\.nuget\packages\verify\31.12.5\buildTransitive\Verify.props(70,5): warning : No solution files found. Unable to auto-discover SolutionDir and SolutionName. Verify searches for .slnx and .sln files in the project directory 'C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1', parent directory, and parent's parent directory. To resolve this, either add a solution file to one of these locations, or explicitly set SolutionDir and SolutionName via command line: /p:SolutionDir="C:\Path\To\Solution\" /p:SolutionName="MySolution" [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
BenchmarkDotNet.Autogenerated -> C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1.dll
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
Build FAILED.
C:\Users\luis\.nuget\packages\verify\31.12.5\buildTransitive\Verify.props(70,5): warning : No solution files found. Unable to auto-discover SolutionDir and SolutionName. Verify searches for .slnx and .sln files in the project directory 'C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1', parent directory, and parent's parent directory. To resolve this, either add a solution file to one of these locations, or explicitly set SolutionDir and SolutionName via command line: /p:SolutionDir="C:\Path\To\Solution\" /p:SolutionName="MySolution" [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
1 Warning(s)
6 Error(s)
Time Elapsed 00:00:39.44

Looks like the error happened while building BenchmarkDotNet.Autogenerated. The dllgatherer only crashed because I didn't build the project before running the IntigrationTests. All those files do exist.

BenchmarkDotNet.IntegrationTests-1-build-no-restore-no-deps.binlog.zip

@timcassell

Copy link
Copy Markdown
Collaborator

Looks like there's a merge conflict.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

Looks like there's a merge conflict.

Should be fixed now.

https://github.com/twobrainsgmbh/BenchmarkDotNet/actions/runs/22404078490

Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmGenerator.cs Outdated
<WasmTargetsPath>$([System.IO.Path]::ChangeExtension('$(OriginalCSProjPath)', '.Wasm.targets'))</WasmTargetsPath>
<WasmDataDir>$WASMDATADIR$</WasmDataDir>
<WasmDataDir Condition="'$(WasmDataDir)' != ''">$([MSBuild]::NormalizeDirectory($(WasmDataDir)))</WasmDataDir>
<WasmMainJSPath>$MAINJS$</WasmMainJSPath>

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ilonatommy You recently changed away from this property, what are your thoughts here?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, it should work for publish.

Comment threadsrc/BenchmarkDotNet/Helpers/ProcessHelper.cs
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmToolchain.cs Outdated
Comment threadsrc/BenchmarkDotNet/ConsoleArguments/ConfigParser.cs Outdated
Comment threadsrc/BenchmarkDotNet/Environments/Runtimes/WasmRuntime.cs Outdated
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmToolchain.cs Outdated
@timcasselltimcassell linked an issue Feb 27, 2026 that may be closed by this pull request
@timcassell

Copy link
Copy Markdown
Collaborator

@pavelsavarapavelsavara left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, but wait for Ilona's review

Comment threadsrc/BenchmarkDotNet/Templates/benchmark-main.mjs Outdated
Comment threadtests/BenchmarkDotNet.IntegrationTests/WasmTests.cs
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmGenerator.cs Outdated
Comment threadsrc/BenchmarkDotNet/ConsoleArguments/CommandLineOptions.cs Outdated
Comment threadsrc/BenchmarkDotNet/Environments/Runtimes/WasmRuntime.cs Outdated
FreyLuisand others added 2 commits March 1, 2026 21:34
Co-authored-by: Tim Cassell <cassell.timothy@gmail.com>
Co-authored-by: Tim Cassell <cassell.timothy@gmail.com>
<WasmTargetsPath>$([System.IO.Path]::ChangeExtension('$(OriginalCSProjPath)', '.Wasm.targets'))</WasmTargetsPath>
<WasmDataDir>$WASMDATADIR$</WasmDataDir>
<WasmDataDir Condition="'$(WasmDataDir)' != ''">$([MSBuild]::NormalizeDirectory($(WasmDataDir)))</WasmDataDir>
<WasmMainJSPath>$MAINJS$</WasmMainJSPath>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, it should work for publish.

=> HashCode.Combine(base.GetHashCode(), JavaScriptEngine, JavaScriptEngineArguments, Aot, RuntimeFlavor);
=> HashCode.Combine(base.GetHashCode(), JavaScriptEngine, JavaScriptEngineArguments, JavaScriptEngineArgumentFormatter, IsAOT, RuntimeFlavor, ProcessTimeoutMinutes);

private static string DefaultArgumentFormatter(WasmRuntime runtime, ArtifactsPaths artifactsPaths, string args)

@ilonatommyilonatommyMar 2, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will it be coupled with a PR in perf repo? This formatter introduces double --module for v8 currently.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I've prepared a branch that removes --module as an argument.

FreyLuis/dotnet-performance@2b67d2f

@timcasselltimcassell left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @FreyLuis

@timcassell
timcassell merged commit 79a28f2 into dotnet:masterMar 2, 2026
11 checks passed
@timcasselltimcassell added this to the v0.16.0 milestone Mar 2, 2026
@FreyLuis
FreyLuis deleted the improve-wasm branch March 2, 2026 19:51
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

improve wasm support

4 participants

@FreyLuis@timcassell@pavelsavara@ilonatommy
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

improve wasm support - #3020

Merged
timcassell merged 15 commits into
dotnet:masterfrom
twobrainsgmbh:improve-wasm
Mar 2, 2026
Merged

improve wasm support#3020
timcassell merged 15 commits into
dotnet:masterfrom
twobrainsgmbh:improve-wasm

Conversation

@FreyLuis

@FreyLuisFreyLuis commented Feb 22, 2026

Copy link
Copy Markdown
Contributor

This PR aims to improve WASM support (as described in #2890) in a few ways:

  • Benchmarking WASM on Windows is now supported.
  • Running on node.js is now supported.
  • The JavaScriptEngine now resolves executables from the PATH.
  • A new mainJsTemplatePath option allows customizing the startup script (with polyfill, for example).
  • Removed unnecessary --wasmDataDir option, that was used by dotnet/performance to set WasmMainJSPath.
  • Removed outdated--expose_wasm as default args for javaScriptEngineArguments.
  • run-selected-tests pipeline fixed with wasm

AOT currently fails because the unit tests set only MonoAotCompilerMode and not the WasmRuntimes aot option. I've fixed the test and disabled it for now.

@FreyLuisFreyLuis changed the title Improve wasmimprove wasm supportFeb 22, 2026
@timcassell

Copy link
Copy Markdown
Collaborator

AOT currently fails because the unit tests set only MonoAotCompilerMode and not the WasmRuntimes aot option. I've fixed the test and disabled it for now.

Looking at the code, WasmRuntime.Aot isn't actually used. The toolchain passes aot: netCoreAppSettings.AOTCompilerMode == MonoAotLLVM.MonoAotCompilerMode.wasm to the generator. If the tests are failing, it's due to your changes. They should not be disabled.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

Looking at the code, WasmRuntime.Aot isn't actually used. The toolchain passes aot: netCoreAppSettings.AOTCompilerMode == MonoAotLLVM.MonoAotCompilerMode.wasm to the generator.

It is used right here which then sets the RunAOTCompilation flag.

I have a ci run without the last commit on main, that worked. It seems like the switch to the Microsoft.NET.Sdk.WebAssembly causes some issues with my changes. I'll see if i can fix that later.

Comment threadtests/BenchmarkDotNet.IntegrationTests/WasmTests.cs Outdated
@timcassell

Copy link
Copy Markdown
Collaborator

It is used right here which then sets the RunAOTCompilation flag.

Oh, duh, not sure how I missed that. What a mess, that could use some cleanup, too. So the test was never actually testing aot.

@timcassell

Copy link
Copy Markdown
Collaborator

I have a ci run without the last commit on main, that worked. It seems like the switch to the Microsoft.NET.Sdk.WebAssembly causes some issues with my changes. I'll see if i can fix that later.

Maybe the wwwroot is necessary? I also have a green CI run where I had it running on node, with minimal other changes to the toolchain (besides the async refactor and mjs changes for websocket).

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

I don't know why the build doesn't fail in the ci, it crashes on my windows machine with the following errors:

 C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.FSharp\release_net8.0\BenchmarkDotNet.IntegrationTests.FSharp.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.FSharp\BenchmarkDotNet.IntegrationTests.FSharp.fsproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.VisualBasic\release_net8.0\BenchmarkDotNet.IntegrationTests.VisualBasic.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.VisualBasic\BenchmarkDotNet.IntegrationTests.VisualBasic.vbproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.Diagnostics.dotTrace\release_net8.0\BenchmarkDotNet.Diagnostics.dotTrace.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\src\BenchmarkDotNet.Diagnostics.dotTrace\BenchmarkDotNet.Diagnostics.dotTrace.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.Diagnostics.dotMemory\release_net8.0\BenchmarkDotNet.Diagnostics.dotMemory.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\src\BenchmarkDotNet.Diagnostics.dotMemory\BenchmarkDotNet.Diagnostics.dotMemory.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.Static\release_net8.0\BenchmarkDotNet.IntegrationTests.Static.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.Static\BenchmarkDotNet.IntegrationTests.Static.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.EnabledOptimizations\release_net8.0\BenchmarkDotNet.IntegrationTests.EnabledOptimizations.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.EnabledOptimizations\BenchmarkDotNet.IntegrationTests.EnabledOptimizations.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.DisabledOptimizations\release_net8.0\BenchmarkDotNet.IntegrationTests.DisabledOptimizations.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.DisabledOptimizations\BenchmarkDotNet.IntegrationTests.DisabledOptimizations.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly\release_net8.0\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly.csproj::TargetFramework=net8.0]

It does work with a minimal project (including main.js path).
The main.js error seems to only happen in the integration tests...

I'll see if i can fix this tomorrow.

@FreyLuis
FreyLuis marked this pull request as ready for review February 24, 2026 21:53
@FreyLuis

FreyLuis commented Feb 24, 2026

Copy link
Copy Markdown
ContributorAuthor

@timcassell It works now.

The IntigrationTests still fail while building the dllgatherer on windows on my pc, but i couldn't reproduce it on another machine or with another project.

Like I wrote in the description, this does remove the --wasmDataDir argument and breaks the current state of dotnet/performance. There is already a PR that removes it.

I've noticed an odd behavior that I did not want to touch: When I set KeepBenchmarkFiles to true and build the project twice, it references all dlls from the previous build. I'm not sure if BenchmarkDotNet should delete the dlls before reusing the folder or build in another folder instead.

@timcassell

Copy link
Copy Markdown
Collaborator

The IntigrationTests still fail while building the dllgatherer on windows on my pc, but i couldn't reproduce it on another machine or with another project.

What's the error?

I've noticed an odd behavior that I did not want to touch: When I set KeepBenchmarkFiles to true and build the project twice, it references all dlls from the previous build. I'm not sure if BenchmarkDotNet should delete the dlls before reusing the folder or build in another folder instead.

KeepBenchmarkFiles is intended for debugging. The user is expected to delete it before running benchmarks again. I don't think we need to do anything about it.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

What's the error?

 // start dotnet build "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj" -f net8.0 -c Release --no-restore --no-dependencies --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true -bl:BenchmarkDotNet.IntegrationTests-1-build-no-restore-no-deps.binlog in C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1
C:\Users\luis\.nuget\packages\verify\31.12.5\buildTransitive\Verify.props(70,5): warning : No solution files found. Unable to auto-discover SolutionDir and SolutionName. Verify searches for .slnx and .sln files in the project directory 'C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1', parent directory, and parent's parent directory. To resolve this, either add a solution file to one of these locations, or explicitly set SolutionDir and SolutionName via command line: /p:SolutionDir="C:\Path\To\Solution\" /p:SolutionName="MySolution" [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
BenchmarkDotNet.Autogenerated -> C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1.dll
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
Build FAILED.
C:\Users\luis\.nuget\packages\verify\31.12.5\buildTransitive\Verify.props(70,5): warning : No solution files found. Unable to auto-discover SolutionDir and SolutionName. Verify searches for .slnx and .sln files in the project directory 'C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1', parent directory, and parent's parent directory. To resolve this, either add a solution file to one of these locations, or explicitly set SolutionDir and SolutionName via command line: /p:SolutionDir="C:\Path\To\Solution\" /p:SolutionName="MySolution" [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
1 Warning(s)
6 Error(s)
Time Elapsed 00:00:39.44

Looks like the error happened while building BenchmarkDotNet.Autogenerated. The dllgatherer only crashed because I didn't build the project before running the IntigrationTests. All those files do exist.

BenchmarkDotNet.IntegrationTests-1-build-no-restore-no-deps.binlog.zip

@timcassell

Copy link
Copy Markdown
Collaborator

Looks like there's a merge conflict.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

Looks like there's a merge conflict.

Should be fixed now.

https://github.com/twobrainsgmbh/BenchmarkDotNet/actions/runs/22404078490

Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmGenerator.cs Outdated
<WasmTargetsPath>$([System.IO.Path]::ChangeExtension('$(OriginalCSProjPath)', '.Wasm.targets'))</WasmTargetsPath>
<WasmDataDir>$WASMDATADIR$</WasmDataDir>
<WasmDataDir Condition="'$(WasmDataDir)' != ''">$([MSBuild]::NormalizeDirectory($(WasmDataDir)))</WasmDataDir>
<WasmMainJSPath>$MAINJS$</WasmMainJSPath>

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ilonatommy You recently changed away from this property, what are your thoughts here?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, it should work for publish.

Comment threadsrc/BenchmarkDotNet/Helpers/ProcessHelper.cs
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmToolchain.cs Outdated
Comment threadsrc/BenchmarkDotNet/ConsoleArguments/ConfigParser.cs Outdated
Comment threadsrc/BenchmarkDotNet/Environments/Runtimes/WasmRuntime.cs Outdated
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmToolchain.cs Outdated
@timcasselltimcassell linked an issue Feb 27, 2026 that may be closed by this pull request
@timcassell

Copy link
Copy Markdown
Collaborator

@pavelsavarapavelsavara left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, but wait for Ilona's review

Comment threadsrc/BenchmarkDotNet/Templates/benchmark-main.mjs Outdated
Comment threadtests/BenchmarkDotNet.IntegrationTests/WasmTests.cs
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmGenerator.cs Outdated
Comment threadsrc/BenchmarkDotNet/ConsoleArguments/CommandLineOptions.cs Outdated
Comment threadsrc/BenchmarkDotNet/Environments/Runtimes/WasmRuntime.cs Outdated
FreyLuisand others added 2 commits March 1, 2026 21:34
Co-authored-by: Tim Cassell <cassell.timothy@gmail.com>
Co-authored-by: Tim Cassell <cassell.timothy@gmail.com>
<WasmTargetsPath>$([System.IO.Path]::ChangeExtension('$(OriginalCSProjPath)', '.Wasm.targets'))</WasmTargetsPath>
<WasmDataDir>$WASMDATADIR$</WasmDataDir>
<WasmDataDir Condition="'$(WasmDataDir)' != ''">$([MSBuild]::NormalizeDirectory($(WasmDataDir)))</WasmDataDir>
<WasmMainJSPath>$MAINJS$</WasmMainJSPath>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, it should work for publish.

=> HashCode.Combine(base.GetHashCode(), JavaScriptEngine, JavaScriptEngineArguments, Aot, RuntimeFlavor);
=> HashCode.Combine(base.GetHashCode(), JavaScriptEngine, JavaScriptEngineArguments, JavaScriptEngineArgumentFormatter, IsAOT, RuntimeFlavor, ProcessTimeoutMinutes);

private static string DefaultArgumentFormatter(WasmRuntime runtime, ArtifactsPaths artifactsPaths, string args)

@ilonatommyilonatommyMar 2, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will it be coupled with a PR in perf repo? This formatter introduces double --module for v8 currently.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I've prepared a branch that removes --module as an argument.

FreyLuis/dotnet-performance@2b67d2f

@timcasselltimcassell left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @FreyLuis

@timcassell
timcassell merged commit 79a28f2 into dotnet:masterMar 2, 2026
11 checks passed
@timcasselltimcassell added this to the v0.16.0 milestone Mar 2, 2026
@FreyLuis
FreyLuis deleted the improve-wasm branch March 2, 2026 19:51
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

improve wasm support

4 participants

@FreyLuis@timcassell@pavelsavara@ilonatommy
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

improve wasm support - #3020

Merged
timcassell merged 15 commits into
dotnet:masterfrom
twobrainsgmbh:improve-wasm
Mar 2, 2026
Merged

improve wasm support#3020
timcassell merged 15 commits into
dotnet:masterfrom
twobrainsgmbh:improve-wasm

Conversation

@FreyLuis

@FreyLuisFreyLuis commented Feb 22, 2026

Copy link
Copy Markdown
Contributor

This PR aims to improve WASM support (as described in #2890) in a few ways:

  • Benchmarking WASM on Windows is now supported.
  • Running on node.js is now supported.
  • The JavaScriptEngine now resolves executables from the PATH.
  • A new mainJsTemplatePath option allows customizing the startup script (with polyfill, for example).
  • Removed unnecessary --wasmDataDir option, that was used by dotnet/performance to set WasmMainJSPath.
  • Removed outdated--expose_wasm as default args for javaScriptEngineArguments.
  • run-selected-tests pipeline fixed with wasm

AOT currently fails because the unit tests set only MonoAotCompilerMode and not the WasmRuntimes aot option. I've fixed the test and disabled it for now.

@FreyLuisFreyLuis changed the title Improve wasmimprove wasm supportFeb 22, 2026
@timcassell

Copy link
Copy Markdown
Collaborator

AOT currently fails because the unit tests set only MonoAotCompilerMode and not the WasmRuntimes aot option. I've fixed the test and disabled it for now.

Looking at the code, WasmRuntime.Aot isn't actually used. The toolchain passes aot: netCoreAppSettings.AOTCompilerMode == MonoAotLLVM.MonoAotCompilerMode.wasm to the generator. If the tests are failing, it's due to your changes. They should not be disabled.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

Looking at the code, WasmRuntime.Aot isn't actually used. The toolchain passes aot: netCoreAppSettings.AOTCompilerMode == MonoAotLLVM.MonoAotCompilerMode.wasm to the generator.

It is used right here which then sets the RunAOTCompilation flag.

I have a ci run without the last commit on main, that worked. It seems like the switch to the Microsoft.NET.Sdk.WebAssembly causes some issues with my changes. I'll see if i can fix that later.

Comment threadtests/BenchmarkDotNet.IntegrationTests/WasmTests.cs Outdated
@timcassell

Copy link
Copy Markdown
Collaborator

It is used right here which then sets the RunAOTCompilation flag.

Oh, duh, not sure how I missed that. What a mess, that could use some cleanup, too. So the test was never actually testing aot.

@timcassell

Copy link
Copy Markdown
Collaborator

I have a ci run without the last commit on main, that worked. It seems like the switch to the Microsoft.NET.Sdk.WebAssembly causes some issues with my changes. I'll see if i can fix that later.

Maybe the wwwroot is necessary? I also have a green CI run where I had it running on node, with minimal other changes to the toolchain (besides the async refactor and mjs changes for websocket).

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

I don't know why the build doesn't fail in the ci, it crashes on my windows machine with the following errors:

 C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.FSharp\release_net8.0\BenchmarkDotNet.IntegrationTests.FSharp.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.FSharp\BenchmarkDotNet.IntegrationTests.FSharp.fsproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.VisualBasic\release_net8.0\BenchmarkDotNet.IntegrationTests.VisualBasic.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.VisualBasic\BenchmarkDotNet.IntegrationTests.VisualBasic.vbproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.Diagnostics.dotTrace\release_net8.0\BenchmarkDotNet.Diagnostics.dotTrace.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\src\BenchmarkDotNet.Diagnostics.dotTrace\BenchmarkDotNet.Diagnostics.dotTrace.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.Diagnostics.dotMemory\release_net8.0\BenchmarkDotNet.Diagnostics.dotMemory.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\src\BenchmarkDotNet.Diagnostics.dotMemory\BenchmarkDotNet.Diagnostics.dotMemory.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.Static\release_net8.0\BenchmarkDotNet.IntegrationTests.Static.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.Static\BenchmarkDotNet.IntegrationTests.Static.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.EnabledOptimizations\release_net8.0\BenchmarkDotNet.IntegrationTests.EnabledOptimizations.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.EnabledOptimizations\BenchmarkDotNet.IntegrationTests.EnabledOptimizations.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.DisabledOptimizations\release_net8.0\BenchmarkDotNet.IntegrationTests.DisabledOptimizations.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.DisabledOptimizations\BenchmarkDotNet.IntegrationTests.DisabledOptimizations.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Microsoft.Common.CurrentVersion.targets(4903,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net462\BenchmarkDotNet.IntegrationTests-1/.artifacts/\obj\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly\release_net8.0\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly.dll" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly\BenchmarkDotNet.IntegrationTests.ConfigPerAssembly.csproj::TargetFramework=net8.0]

It does work with a minimal project (including main.js path).
The main.js error seems to only happen in the integration tests...

I'll see if i can fix this tomorrow.

@FreyLuis
FreyLuis marked this pull request as ready for review February 24, 2026 21:53
@FreyLuis

FreyLuis commented Feb 24, 2026

Copy link
Copy Markdown
ContributorAuthor

@timcassell It works now.

The IntigrationTests still fail while building the dllgatherer on windows on my pc, but i couldn't reproduce it on another machine or with another project.

Like I wrote in the description, this does remove the --wasmDataDir argument and breaks the current state of dotnet/performance. There is already a PR that removes it.

I've noticed an odd behavior that I did not want to touch: When I set KeepBenchmarkFiles to true and build the project twice, it references all dlls from the previous build. I'm not sure if BenchmarkDotNet should delete the dlls before reusing the folder or build in another folder instead.

@timcassell

Copy link
Copy Markdown
Collaborator

The IntigrationTests still fail while building the dllgatherer on windows on my pc, but i couldn't reproduce it on another machine or with another project.

What's the error?

I've noticed an odd behavior that I did not want to touch: When I set KeepBenchmarkFiles to true and build the project twice, it references all dlls from the previous build. I'm not sure if BenchmarkDotNet should delete the dlls before reusing the folder or build in another folder instead.

KeepBenchmarkFiles is intended for debugging. The user is expected to delete it before running benchmarks again. I don't think we need to do anything about it.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

What's the error?

 // start dotnet build "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj" -f net8.0 -c Release --no-restore --no-dependencies --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true -bl:BenchmarkDotNet.IntegrationTests-1-build-no-restore-no-deps.binlog in C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1
C:\Users\luis\.nuget\packages\verify\31.12.5\buildTransitive\Verify.props(70,5): warning : No solution files found. Unable to auto-discover SolutionDir and SolutionName. Verify searches for .slnx and .sln files in the project directory 'C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1', parent directory, and parent's parent directory. To resolve this, either add a solution file to one of these locations, or explicitly set SolutionDir and SolutionName via command line: /p:SolutionDir="C:\Path\To\Solution\" /p:SolutionName="MySolution" [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
BenchmarkDotNet.Autogenerated -> C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1.dll
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
Build FAILED.
C:\Users\luis\.nuget\packages\verify\31.12.5\buildTransitive\Verify.props(70,5): warning : No solution files found. Unable to auto-discover SolutionDir and SolutionName. Verify searches for .slnx and .sln files in the project directory 'C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1', parent directory, and parent's parent directory. To resolve this, either add a solution file to one of these locations, or explicitly set SolutionDir and SolutionName via command line: /p:SolutionDir="C:\Path\To\Solution\" /p:SolutionName="MySolution" [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\pt-BR\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hans\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.TestPlatform.CommunicationUtilities.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
C:\Program Files\dotnet\sdk\10.0.103\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.Publish.targets(212,5): error MSB3030: Could not copy the file "C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\bin\Release\net8.0\wwwroot\_framework\zh-Hant\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.wasm" because it was not found. [C:\Users\luis\source\libraries\BenchmarkDotNet\BenchmarkDotNet\tests\BenchmarkDotNet.IntegrationTests\bin\Release\net8.0\BenchmarkDotNet.IntegrationTests-1\BenchmarkDotNet.Autogenerated.csproj::TargetFramework=net8.0]
1 Warning(s)
6 Error(s)
Time Elapsed 00:00:39.44

Looks like the error happened while building BenchmarkDotNet.Autogenerated. The dllgatherer only crashed because I didn't build the project before running the IntigrationTests. All those files do exist.

BenchmarkDotNet.IntegrationTests-1-build-no-restore-no-deps.binlog.zip

@timcassell

Copy link
Copy Markdown
Collaborator

Looks like there's a merge conflict.

@FreyLuis

Copy link
Copy Markdown
ContributorAuthor

Looks like there's a merge conflict.

Should be fixed now.

https://github.com/twobrainsgmbh/BenchmarkDotNet/actions/runs/22404078490

Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmGenerator.cs Outdated
<WasmTargetsPath>$([System.IO.Path]::ChangeExtension('$(OriginalCSProjPath)', '.Wasm.targets'))</WasmTargetsPath>
<WasmDataDir>$WASMDATADIR$</WasmDataDir>
<WasmDataDir Condition="'$(WasmDataDir)' != ''">$([MSBuild]::NormalizeDirectory($(WasmDataDir)))</WasmDataDir>
<WasmMainJSPath>$MAINJS$</WasmMainJSPath>

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ilonatommy You recently changed away from this property, what are your thoughts here?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, it should work for publish.

Comment threadsrc/BenchmarkDotNet/Helpers/ProcessHelper.cs
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmToolchain.cs Outdated
Comment threadsrc/BenchmarkDotNet/ConsoleArguments/ConfigParser.cs Outdated
Comment threadsrc/BenchmarkDotNet/Environments/Runtimes/WasmRuntime.cs Outdated
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmToolchain.cs Outdated
@timcasselltimcassell linked an issue Feb 27, 2026 that may be closed by this pull request
@timcassell

Copy link
Copy Markdown
Collaborator

@pavelsavarapavelsavara left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, but wait for Ilona's review

Comment threadsrc/BenchmarkDotNet/Templates/benchmark-main.mjs Outdated
Comment threadtests/BenchmarkDotNet.IntegrationTests/WasmTests.cs
Comment threadsrc/BenchmarkDotNet/Toolchains/MonoWasm/WasmGenerator.cs Outdated
Comment threadsrc/BenchmarkDotNet/ConsoleArguments/CommandLineOptions.cs Outdated
Comment threadsrc/BenchmarkDotNet/Environments/Runtimes/WasmRuntime.cs Outdated
FreyLuisand others added 2 commits March 1, 2026 21:34
Co-authored-by: Tim Cassell <cassell.timothy@gmail.com>
Co-authored-by: Tim Cassell <cassell.timothy@gmail.com>
<WasmTargetsPath>$([System.IO.Path]::ChangeExtension('$(OriginalCSProjPath)', '.Wasm.targets'))</WasmTargetsPath>
<WasmDataDir>$WASMDATADIR$</WasmDataDir>
<WasmDataDir Condition="'$(WasmDataDir)' != ''">$([MSBuild]::NormalizeDirectory($(WasmDataDir)))</WasmDataDir>
<WasmMainJSPath>$MAINJS$</WasmMainJSPath>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, it should work for publish.

=> HashCode.Combine(base.GetHashCode(), JavaScriptEngine, JavaScriptEngineArguments, Aot, RuntimeFlavor);
=> HashCode.Combine(base.GetHashCode(), JavaScriptEngine, JavaScriptEngineArguments, JavaScriptEngineArgumentFormatter, IsAOT, RuntimeFlavor, ProcessTimeoutMinutes);

private static string DefaultArgumentFormatter(WasmRuntime runtime, ArtifactsPaths artifactsPaths, string args)

@ilonatommyilonatommyMar 2, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will it be coupled with a PR in perf repo? This formatter introduces double --module for v8 currently.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I've prepared a branch that removes --module as an argument.

FreyLuis/dotnet-performance@2b67d2f

@timcasselltimcassell left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @FreyLuis

@timcassell
timcassell merged commit 79a28f2 into dotnet:masterMar 2, 2026
11 checks passed
@timcasselltimcassell added this to the v0.16.0 milestone Mar 2, 2026
@FreyLuis
FreyLuis deleted the improve-wasm branch March 2, 2026 19:51
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

improve wasm support

4 participants

@FreyLuis@timcassell@pavelsavara@ilonatommy