Uh oh!
There was an error while loading. Please reload this page.
[browser][coreCLR] Loading WebCIL 1.0 - #124268
Conversation
Tagging subscribers to this area: @agocke, @jeffschwMSFT, @elinor-fung |
There was a problem hiding this comment.
Pull request overview
This PR adds support for loading WebCIL version 1.0 assemblies in CoreCLR on browser/WASM targets. WebCIL is an alternative container format for ECMA-335 assemblies that strips PE headers and packages assemblies as WebAssembly modules with a .wasm extension, helping avoid issues with firewalls/antivirus software that block .dll files.
Changes:
- Added
WebCILImageLayoutC++ class that extendsPEImageLayoutto handle WebCIL format, parsing WebCIL headers and mapping RVAs to file offsets - Implemented
instantiateWebCILModulein TypeScript that instantiates WebCIL .wasm modules and extracts assembly payloads into aligned memory - Enabled WebCIL support for CoreCLR by removing
WasmEnableWebcil=falserestrictions and updating test configurations
Reviewed changes
Copilot reviewed 17 out of 18 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| src/native/libs/Common/JavaScript/types/public-api.ts | Added "webcil1" asset behavior type |
| src/native/libs/Common/JavaScript/types/exchange.ts | Added instantiateWebCILModule to BrowserHost exports |
| src/native/libs/Common/JavaScript/cross-module/index.ts | Updated export table to include instantiateWebCILModule |
| src/native/corehost/browserhost/loader/dotnet.d.ts | Added "webcil1" type definition |
| src/native/corehost/browserhost/loader/assets.ts | Added WebCIL detection and loading logic, mapping .wasm to .dll paths |
| src/native/corehost/browserhost/host/index.ts | Exported instantiateWebCILModule function |
| src/native/corehost/browserhost/host/host.ts | Updated assembly path mapping to replace .wasm with .dll |
| src/native/corehost/browserhost/host/assets.ts | Implemented instantiateWebCILModule to extract WebCIL payload and register assemblies |
| src/mono/wasm/Wasm.Build.Tests/Common/BuildEnvironment.cs | Removed CoreCLR restriction for WebCIL in tests |
| src/mono/browser/build/WasmApp.InTree.props | Removed WasmEnableWebcil=false for CoreCLR, updated TODO comment |
| src/coreclr/vm/webcildecoder.cpp | New file implementing WebCILImageLayout class for parsing and validating WebCIL format |
| src/coreclr/vm/peimagelayout.h | Added WebCIL header structures and WebCILImageLayout class declaration |
| src/coreclr/vm/peimagelayout.cpp | Added WebCIL format detection in LoadFlat |
| src/coreclr/vm/peassembly.cpp | Excluded 32-bit NT headers check for TARGET_BROWSER, added braces for consistency |
| src/coreclr/vm/coreassemblyspec.cpp | Added braces around single-statement if bodies |
| src/coreclr/vm/CMakeLists.txt | Added webcildecoder.cpp to browser build |
| src/coreclr/inc/pedecoder.h | Made specific PEDecoder methods virtual for browser target to enable WebCILImageLayout overrides |
| eng/testing/tests.browser.targets | Removed WasmEnableWebcil=false for CoreCLR, updated TODO comment |
Uh oh!
There was an error while loading. Please reload this page.
davidwrighton
commented
Feb 11, 2026
Please have @elinor-fung look at this |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
5adef6d to
102345aCompareUh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
# Conflicts: # src/native/libs/Common/JavaScript/host/assets.ts # src/native/libs/Common/JavaScript/host/host.ts # src/native/libs/Common/JavaScript/types/exchange.ts
adamperlin
commented
Feb 20, 2026
Definitely agreed that it is out of scope for this PR! I was mostly just wanting to understand what direction we are heading in on the host loading side and what work is still required, so I appreciate the clarification here. I don't have any more feedback, and I think this looks good for now as a start! Since I have limited expertise in this area though, it would be great if @elinor-fung could take a look before this goes in. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
pavelsavara
commented
Feb 23, 2026
As we are waiting for more feedback on native part, I split of JS part, for which I'm pretty confident into #124758 and will merge that first. |
elinor-fung
commented
Feb 24, 2026
This feels a bit like
I know that may be a significant amount of refactoring, but hopefully somewhat mechanical and something copilot would be good at. |
jkotas
commented
Feb 24, 2026
Also, we won't need to artificially inflate the section headers if we go with Elinor's suggestion. |
pavelsavara
commented
Feb 25, 2026
The new It will be massive change, are you sure ? I think we would like to avoid C++ virtual methods, so that DAC is easier, right ? |
pavelsavara
commented
Feb 26, 2026
Closing in favor of #124904 |
Enable WebCIL support for CoreCLR on Browser/WASM
Fixes#120248
WebCIL format v1.0 with 16-byte section alignment and IMAGE_SECTION_HEADER format
Bumps WebCIL version from 0.0 to 1.0.
WebcilConverternow emits section data at 16-byte-aligned offsets, ensuring RVA static fields backingReadOnlySpan<T>over types up toVector128<T>retain their natural alignment.IMAGE_SECTION_HEADERthat makes the code of reading much simpler.CoreCLR PEDecoder: native WebCIL parsing
New
src/coreclr/inc/webcil.hdefinesWebcilHeaderandWebcilSectionHeaderC structs withstatic_assertsize checks.PEDecodergains:FLAG_WEBCILflag;HasWebcilHeaders()validates magic, version, section count/bounds/ordering and synthesizesIMAGE_SECTION_HEADER[]from WebCIL sections soRvaToSection()/RvaToOffset()work uniformly.HasHeaders()/CheckHeaders()as unified entry points that dispatch to WebCIL or NT paths.HasDirectoryEntry(),GetDirectoryEntryData()(handlesCOMHEADERandDEBUGentries viaWebcilHeaderfields with explicit range validation against section data).CheckCorHeader()andCheckILOnly()WebCIL branches (WebCIL images are always IL-only by definition).GetPEKindAndMachine()reportspeILonly/IMAGE_FILE_MACHINE_I386for WebCIL.GetNumberOfRvaAndSizes()moved from public to private API;GetNumberOfSections()/FindFirstSection()delegate to synthesized headers for WebCIL.CheckNTHeaders()toCheckHeaders()/HasHeaders().PEImage / PEAssembly integration
PEImageexposesHasHeaders()forwarding toPEDecoder::HasHeaders().PEAssemblyusesHasHeaders()instead ofHasNTHeaders()for metadata access.Browser host loader: WebCIL module instantiation
instantiateWebCILModule()in host assets:.wasmwrapper as a WebAssembly modulegetWebcilSize/getWebcilPayloadexports to extract the raw WebCIL.dllvirtual path.getWasmMemory/getWasmTableWasmEnableWebcil.DAC support gap
All WebCIL code paths in
PEDecoderare gated behind#ifdef TARGET_BROWSER, which is mutually exclusive withDACCESS_COMPILE.Should we drop
#ifdef TARGET_BROWSER? Or build target specific DAC binaries ?Follow up in #124467