You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从外部控制台程序运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 16:10:30