如何从外部控制台程序运行Blazor Server应用?
背景
我正在开发一款偶尔需要搭载Blazor UI的应用,想把Blazor UI部分做成插件交付。目前已经有几个非UI插件运行正常,但我对Blazor不算精通。
拿VS默认的Blazor演示应用(带计数器和天气功能)来说,直接运行完全没问题。现在我想把这个演示程序编译成程序集,而非默认的控制台应用,再通过另一个控制台程序启动它,该怎么实现?
我试过之后发现,次级控制台应用必须把项目SDK设为Microsoft.NET.Sdk.Web(不能只用Microsoft.NET.Sdk)才能运行,但启动后应用显示异常,我推测是找不到webroot目录。
问题
要怎么操作才能让次级控制台程序启动编译为程序集的Blazor应用,让它和直接启动时的外观、行为完全一致?也就是如何让标准启动流程在外部控制台里正常工作?
直接运行Blazor应用时,以下代码能正常工作:
public class MyProgram { public static void Main(string[] args) { new OurTestBlazorApp().Start(); } }
public class OurTestBlazorApp { public void Start() { var builder = WebApplication.CreateBuilder(); builder.Services.AddRazorPages(); builder.Services.AddServerSideBlazor(); builder.Services.AddSingleton<WeatherForecastService>(); var app = builder.Build(); if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); } app.UseStaticFiles(); app.UseRouting(); app.MapBlazorHub(); app.MapFallbackToPage("/_Host"); app.Run(); } }
但创建一个纯控制台应用,把项目文件改成:
<Project Sdk="Microsoft.NET.Sdk.Web">
之后运行以下代码:
Console.WriteLine("Hello, World!"); new OurTestBlazorApp().Start();
应用显示异常。
求帮忙解决这个问题,非常感谢。
此致
Magnus
解决方案
核心问题是次级控制台程序无法找到Blazor程序集里的webroot、Razor页面、组件等资源,按以下步骤处理即可:
1. 嵌入Blazor插件的资源
在Blazor插件项目的.csproj文件中添加配置,将webroot、页面、组件等资源嵌入程序集:
<ItemGroup> <EmbeddedResource Include="wwwroot\**" /> <EmbeddedResource Include="Pages\**" /> <EmbeddedResource Include="Shared\**" /> <EmbeddedResource Include="_Host.cshtml" /> <EmbeddedResource Include="_Layout.cshtml" /> <EmbeddedResource Include="_Error.cshtml" /> </ItemGroup>
2. 修改Blazor启动逻辑适配外部加载
调整OurTestBlazorApp的Start方法,指定资源加载路径并配置嵌入式资源支持:
using Microsoft.Extensions.FileProviders; public class OurTestBlazorApp { public void Start() { var blazorAssembly = typeof(OurTestBlazorApp).Assembly; var builder = WebApplication.CreateBuilder(); // 设置内容根目录为Blazor程序集所在目录 builder.WebHost.UseContentRoot(Path.GetDirectoryName(blazorAssembly.Location)); // 配置使用嵌入式静态文件 builder.Services.AddStaticFiles(options => { options.FileProvider = new EmbeddedFileProvider(blazorAssembly, $"{blazorAssembly.GetName().Name}.wwwroot"); }); // 添加嵌入式Razor页面支持 builder.Services.AddRazorPages() .AddEmbeddedResources(blazorAssembly); builder.Services.AddServerSideBlazor(); builder.Services.AddSingleton<WeatherForecastService>(); var app = builder.Build(); if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); } app.UseStaticFiles(); app.UseRouting(); app.MapBlazorHub(); app.MapFallbackToPage("/_Host"); app.Run(); } }
3. 配置次级控制台项目
- 确保次级控制台项目的SDK为
Microsoft.NET.Sdk.Web - 添加对Blazor插件程序集的引用,在
.csproj中加入:
<ItemGroup> <ProjectReference Include="..\YourBlazorPlugin\YourBlazorPlugin.csproj" /> </ItemGroup>
4. 验证资源嵌入
可以用ILSpy等工具查看Blazor程序集,确认wwwroot、Pages等目录的文件已被嵌入,避免遗漏资源导致加载失败。
内容的提问来源于stack exchange,提问作者metscore
相关产品推荐
相关产品推荐

