diff --git a/src/Uno.Wasm.Bootstrap/Uno.Wasm.Bootstrap.csproj b/src/Uno.Wasm.Bootstrap/Uno.Wasm.Bootstrap.csproj index 9b9feeb00..c2e1ac814 100644 --- a/src/Uno.Wasm.Bootstrap/Uno.Wasm.Bootstrap.csproj +++ b/src/Uno.Wasm.Bootstrap/Uno.Wasm.Bootstrap.csproj @@ -62,8 +62,13 @@ true tools false - false + + + true + tools + false + @@ -74,6 +79,7 @@ --> <_UnoTaskDependencies Include="$(NuGetPackageRoot)/mono.cecil/0.11.4/lib/netstandard2.0/*.dll" /> + <_UnoTaskDependencies Include="$(NuGetPackageRoot)/newtonsoft.json/13.0.2/lib/netstandard2.0/*.dll" /> this._context).config.environmentVariables['ASPNETCORE-BROWSER-TOOLS']; + // Take the place of the internal .NET for WebAssembly APIs for metadata updates coming // from the "BrowserLink" feature. - const bootstrapContext = this._context; - (function (Blazor) { Blazor._internal = { initialize: function () { @@ -45,21 +47,11 @@ namespace Uno.WebAssembly.Bootstrap { applyExisting: async function (): Promise { - var hotreloadConfigResponse = await fetch(`/_framework/unohotreload`); - - var modifiableAssemblies = hotreloadConfigResponse.headers.get('DOTNET-MODIFIABLE-ASSEMBLIES'); - var aspnetCoreBrowserTools = hotreloadConfigResponse.headers.get('ASPNETCORE-BROWSER-TOOLS'); - - if (modifiableAssemblies) { - bootstrapContext.MONO.mono_wasm_setenv('DOTNET_MODIFIABLE_ASSEMBLIES', modifiableAssemblies); - } - - // To uncomment once https://github.com/dotnet/aspnetcore/issues/37357#issuecomment-941237000 is released - // if (aspnetCoreBrowserTools == "true") + if (browserToolsVariable == "true") { try { var m = await import(`/_framework/blazor-hotreload.js`); - m.receiveHotReload(); + await m.receiveHotReloadAsync(); } catch (e) { console.error(`Failed to apply initial metadata delta ${e}`); @@ -72,15 +64,15 @@ namespace Uno.WebAssembly.Bootstrap { return HotReloadSupport._getApplyUpdateCapabilitiesMethod(); }, - applyHotReload: function (moduleId: any, metadataDelta: any, ilDelta: any, pdbDelta: any) { + applyHotReload: function (moduleId: any, metadataDelta: any, ilDelta: any, pdbDelta: any, updatedTypes: any) { this.initialize(); - return HotReloadSupport._applyHotReloadDeltaMethod(moduleId, metadataDelta, ilDelta, pdbDelta || ""); + return HotReloadSupport._applyHotReloadDeltaMethod(moduleId, metadataDelta, ilDelta, pdbDelta || "", updatedTypes || []); } }; })((window).Blazor || ((window).Blazor = {})); // Apply pending updates caused by a browser refresh - (window).Blazor._internal.initialize(bootstrapContext.BINDING); + (window).Blazor._internal.initialize(); await (window).Blazor._internal.applyExisting(); } } diff --git a/src/Uno.Wasm.MetadataUpdater/WebAssemblyHotReload.cs b/src/Uno.Wasm.MetadataUpdater/WebAssemblyHotReload.cs index 0dd4dd2f7..d192e0f5f 100644 --- a/src/Uno.Wasm.MetadataUpdater/WebAssemblyHotReload.cs +++ b/src/Uno.Wasm.MetadataUpdater/WebAssemblyHotReload.cs @@ -62,7 +62,7 @@ internal static bool Initialize() /// For framework use only. /// [JSExport] - public static void ApplyHotReloadDelta(string moduleIdString, string metadataDelta, string ilDeta, string pdbDelta) + public static void ApplyHotReloadDelta(string moduleIdString, string metadataDelta, string ilDeta, string pdbDelta, int[] updatedTypes) { if (_linkerEnabled) { @@ -84,6 +84,7 @@ public static void ApplyHotReloadDelta(string moduleIdString, string metadataDel _updateDeltas[0].MetadataDelta = Convert.FromBase64String(metadataDelta); _updateDeltas[0].ILDelta = Convert.FromBase64String(ilDeta); _updateDeltas[0].PdbBytes = Convert.FromBase64String(pdbDelta); + _updateDeltas[0].UpdatedTypes = updatedTypes; _hotReloadAgent!.ApplyDeltas(_updateDeltas); } diff --git a/src/Uno.Wasm.Sample/Program.cs b/src/Uno.Wasm.Sample/Program.cs index 9224eae43..a320960d4 100644 --- a/src/Uno.Wasm.Sample/Program.cs +++ b/src/Uno.Wasm.Sample/Program.cs @@ -21,6 +21,11 @@ using System.Globalization; using System.Runtime.InteropServices.JavaScript; using System.Threading.Tasks; +using System.Reflection.Metadata; +using Uno.Wasm.Sample; +using System.Linq; + +[assembly: MetadataUpdateHandler(typeof(MyHandler))] namespace Uno.Wasm.Sample { @@ -81,6 +86,11 @@ static void Main(string[] args) }, null, 5000, 5000); } } + public static class MyHandler + { + internal static void ClearCache(Type[]? types) => Console.WriteLine("MyHandler.ClearCache"); + internal static void UpdateApplication(Type[]? types) => Console.WriteLine($"MyHandler.UpdateApplication {types.Length} types: {string.Join(", ", types.Select(t => t.Name ))}"); + } #if NET7_0_OR_GREATER public static partial class Imports