Blazor .Net 6.0 热重载
Posted
技术标签:
【中文标题】Blazor .Net 6.0 热重载【英文标题】:Blazor .Net 6.0 Hot Reload 【发布时间】:2021-11-10 00:15:20 【问题描述】:我有一个 asp.net 托管的 blazor wasm 应用程序,我刚刚从 5.0 升级到 6.0。当尝试从 VS 2022 或从 dotnet watch run 进行热重载时,我在浏览器控制台中收到以下错误:
aspnetcore-browser-refresh.js:138
Error: System.NullReferenceException: Object reference not set to an instance of an object.
在 Microsoft.AspNetCore.Components.WebAssembly.HotReload.WebAssemblyHotReload.ApplyHotReloadDelta(String moduleIdString, Byte[] metadataDelta, Byte[] ilDeta) 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object[] 参数,CultureInfo 文化) --- 上一个位置的堆栈跟踪结束 --- 在 Microsoft.JSInterop.Infrastructure.DotNetDispatcher.InvokeSynchronously(JSRuntime jsRuntime、DotNetInvocationInfo& callInfo、IDotNetObjectReference objectReference、String argsJson) 在 Microsoft.JSInterop.Infrastructure.DotNetDispatcher.Invoke(JSRuntime jsRuntime,DotNetInvocationInfo& invocationInfo,字符串 argsJson) 在 Microsoft.AspNetCore.Components.WebAssembly.Services.DefaultWebAssemblyJSRuntime.InvokeDotNet(字符串 assemblyName,字符串 methodIdentifier,字符串 dotNetObjectId,字符串 argsJson) 在 Object._convert_exception_for_method_call (https://localhost:44362/_framework/dotnet.6.0.0.qme34vl4fz.js:1:178709) 在 Object._handle_exception_for_call (https://localhost:44362/_framework/dotnet.6.0.0.qme34vl4fz.js:1:180678) 在 managed__Microsoft_AspNetCore_Components_WebAssembly__Microsoft_AspNetCore_Components_WebAssembly_Services_DefaultWebAssemblyJSRuntime_InvokeDotNet (https://mono-wasm.invalid/managed__Microsoft_AspNetCore_Components_WebAssembly__Microsoft_AspNetCore_Components_WebAssembly_Services_DefaultWebAssemblyJSRuntime_InvokeDotNet:20:21) 在 Object.invokeDotNetFromJS (https://localhost:44362/_framework/blazor.webassembly.js?version=32330328618b4ff08635274a6f31248c:1:42078) 在 g (https://localhost:44362/_framework/blazor.webassembly.js?version=32330328618b4ff08635274a6f31248c:1:1618) 在 Object.e.invokeMethod (https://localhost:44362/_framework/blazor.webassembly.js?version=32330328618b4ff08635274a6f31248c:1:2665) 在 Object.St.Te._internal.applyHotReload (https://localhost:44362/_framework/blazor.webassembly.js?version=32330328618b4ff08635274a6f31248c:1:56100) 在 https://localhost:44362/_framework/aspnetcore-browser-refresh.js:136:33 在 Array.forEach () 在 applyBlazorDeltas (https://localhost:44362/_framework/aspnetcore-browser-refresh.js:134:12)
【问题讨论】:
【参考方案1】:我遇到了完全相同的问题,并在尝试解决问题时遇到了您的帖子。
令我非常懊恼的是,我承认原因是因为运行了 Release 版本。我一定是在不知不觉中(不知何故)将其更改为发布版本。
一旦回到调试版本(但没有附加调试器),热重载现在又可以工作了。
Visual Studio 中的错误:
Chrome 中的错误:
【讨论】:
不幸的是,这并没有为我解决错误。我已经在调试配置中运行了。我尝试切换到发布然后返回调试只是为了看看它是否会有所作为 - 它没有 Blazor wasm 不支持热重载。 @Greg 这不是真的。从 Visual Studio 2022/.NET6 开始,只要您在没有调试的情况下运行,Blazor WASM 就支持热重载。它看起来确实有点问题,但仍然为我们的开发团队节省了一些时间。 这是真的 - 在许多平台上进行了广泛的测试,都在 vanilla blazor 项目上进行了测试 - 在 Blazor wasm 项目中,css 更新不会触发热重载 - 内部 html 更改不会触发热重载 - 已测试在 VS CODE 和 VS 2022 上 - 从终端运行并尝试从 power shell 7.2.1(今天下载)。根据日志识别出文件更改,但之后没有任何反应 - 没有 UI 更新 - 只是冻结。 Microsoft 的 Sayed Hashimi 表示,在 17.0.3 版本中对他不起作用。 developercommunity.visualstudio.com/t/…【参考方案2】:检查您的*.csproj
项目文件,看看是否有任何与目标平台相关的配置。如果是这样,请将其删除并重试。例如:
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<PlatformTarget>AnyCPU</PlatformTarget>
<Prefer32Bit>true</Prefer32Bit>
<Optimize>True</Optimize>
</PropertyGroup>
【讨论】:
【参考方案3】:我们已通过将所有 Microsoft 软件包更新到最新版本来解决此问题。
【讨论】:
【参考方案4】:对我来说,通过将 ASPNETCORE_ENVIRONMENT
从 Local
更改为 Development
解决了这个问题。更多细节在这里:https://github.com/dotnet/aspnetcore/issues/39269
【讨论】:
以上是关于Blazor .Net 6.0 热重载的主要内容,如果未能解决你的问题,请参考以下文章
热重载和运行时编译 Blazor Webassembly 托管