🦁

ASP.NET Core 2.3 で Razor Class Library を使う

2025/02/15に公開

ASP.NET Core 2.3 で Razor Class Library を使う

.NET Framework でも ASP.NET Core は 2.x までは動作していました。2.2 はサポートが終了しましたが、2.1 は .NET Framework に限りサポートされ続けています。しかし 2.2 の方がバージョンが新しいためいろいろと面倒だということで、2.1 を 2.3 としてリリースされました。(参考: ASP.NET Core 2.3 がリリースされました)

ということで、.NET Framework で ASP.NET Core 2.1 のプロジェクトを 2.3 化を試みたのですが、いろいろと問題が... 番号変えただけじゃないのかよ!

Razor Class Library を使う

Razor Class Library とは?

Razor Class Library とは、Razor のクラスライブラリです。開発しているアプリケーションの規模が大きくなるとサブシステムごとに分割します。普通の C# のコードは Visual Studio プロジェクトを分割するだけでいいのですが、Razor はそのままではアセンブリに含まれません。(参考: ASP.NET Core の Razor クラス ライブラリ プロジェクトを使用した再利用可能 UI の作成)

次のように、.csproj で SDK に Microsoft.NET.Sdk.Razor を指定するのと、いくつかのパッケージを参照する必要があります。

Hoge.UI.csproj
<Project Sdk="Microsoft.NET.Sdk.Razor">

    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
        <LangVersion>13</LangVersion>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.1.3"/>
        <PackageReference Include="Microsoft.AspNetCore.Mvc.RazorPages" Version="2.1.11"/>
    </ItemGroup>

</Project>

このプロジェクトをスタートアッププロジェクトで参照します。Startup クラスはいつも通りです。

internal sealed class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc()
            .AddRazorPagesOptions(options => options.AllowAreas = true);
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseMvc();
    }
}

これで、Hoge.UI プロジェクト内の Razor Page が表示されるようになります。

2.3 化する... そして失敗

Razor Class Library 側のパッケージを 2.3.0 にアップデートします。

Hoge.UI.csproj
<Project Sdk="Microsoft.NET.Sdk.Razor">
    <!-- ... -->

    <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.3.0"/>
        <PackageReference Include="Microsoft.AspNetCore.Mvc.RazorPages" Version="2.3.0"/>
    </ItemGroup>

</Project>

そしてスタートアッププロジェクト側も同様にします。

<Project Sdk="Microsoft.NET.Sdk.Web">

    <!-- ... -->

    <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore" Version="2.3.0"/>
        <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.3.0"/>
    </ItemGroup>

</Project>

これでいいはずなんですけど、404 Not Found になります。

対処する

あれこれ試しましたが、Microsoft.AspNetCore.Mvc パッケージを 2.1.3 に戻したらいけました。

Hoge.UI.csproj
<Project Sdk="Microsoft.NET.Sdk.Razor">
    <!-- ... -->

    <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.1.3"/>
        <PackageReference Include="Microsoft.AspNetCore.Mvc.RazorPages" Version="2.3.0"/>
    </ItemGroup>

</Project>

スタートアッププロジェクトで Microsoft.AspNetCore.Mvc パッケージに 2.3.0 を指定していますので、実行時は ASP.NET Core 2.3 が使われます。

終わり

Issue 切っておいた。直るといいなあ。

Discussion