Blazor WebAssembly应用NavMenu显示版本等信息遇空引用异常求助
核心问题定位
你的空引用异常确实来自DisplayEnvironment属性,问题出在Environment.GetEnvironmentVariable的调用方式错误——该方法需要先传入环境变量名称,再指定目标(可选),而你直接传了EnvironmentVariableTarget.Process作为参数,导致方法无法找到对应变量,返回null后触发了异常。
另外,Blazor WebAssembly(WASM)运行在浏览器沙箱中,无法直接访问系统/进程级的环境变量,Environment.GetEnvironmentVariable在这里几乎起不到作用,得用WASM特有的方式获取环境信息。
修复后的完整代码
using System.Reflection; using Microsoft.AspNetCore.Components.WebAssembly.Hosting; public partial class NavMenu { // 注入WASM环境服务 [Inject] private IWebAssemblyHostEnvironment HostEnv { get; set; } = null!; // 更可靠的程序集版本获取方式 protected static Version AppVersion => typeof(NavMenu).Assembly.GetName().Version ?? new Version("1.0.0.0"); // 构建日期计算(避免AppVersion为null时崩溃) protected DateTime BuildDate { get { if (AppVersion.Build == 0 && AppVersion.Revision == 0) return DateTime.Now; // 回退到当前时间,避免计算异常 return new DateTime(2000, 1, 1) .AddDays(AppVersion.Build) .AddSeconds(AppVersion.Revision * 2); } } // 获取WASM运行环境(开发/生产/ staging等) protected string DisplayEnvironment => HostEnv.EnvironmentName; }
关键修复点说明
环境变量获取:
Blazor WASM通过IWebAssemblyHostEnvironment服务获取当前环境(对应ASPNETCORE_ENVIRONMENT或BlazorEnvironment变量),这是官方推荐的方式。如果需要自定义环境变量,要通过wwwroot/appsettings.{env}.json配置,或者在项目文件中通过<BlazorEnvironment>Production</BlazorEnvironment>指定构建时的环境。程序集版本获取:
用typeof(NavMenu).Assembly替代Assembly.GetExecutingAssembly(),因为WASM中执行程序集的上下文可能和预期不同,通过具体类型获取程序集更稳定。同时去掉了强制抛出异常的逻辑,改用默认版本号回退,避免崩溃。构建日期容错:
增加了对AppVersion.Build和Revision为0的判断,防止默认版本号(1.0.0.0)导致计算出不合理的早期日期。
额外配置提示
如果需要显示自定义版本信息(比如Git哈希、构建时间),可以在项目文件(.csproj)中添加以下配置,编译时将信息注入程序集:
<PropertyGroup> <AssemblyVersion>1.0.*</AssemblyVersion> <!-- 自动生成Build和Revision --> <InformationalVersion>$(AssemblyVersion)-$(GitHash)</InformationalVersion> <!-- 需要Git工具支持 --> </PropertyGroup>
内容的提问来源于stack exchange,提问作者Riley Christian

