はじめに
.NET Frameworkで開発されたシステムは現在も数多く稼働しています。
しかし、Microsoftの開発リソースは.NETへ集中しており、新規開発では.NETが主流となっています。
そのため、
- 将来的な保守性を向上させたい
- クラウド活用を進めたい
- 最新の.NETを利用したい
といった理由から、既存システムの移行を検討するケースも増えています。
本記事では、.NET Frameworkから.NETへ移行する際の大まかな流れと、実際によく発生する対応ポイントについて解説します。
※本記事では.NET Framework 4.xから.NET 8以降への移行を想定しています。
移行手順
移行は段階的に進めることが重要です。
Step1:現状調査
依存関係を確認します。
確認項目
- NuGetパッケージ
- サードパーティ製品
- COM参照
- WCF
- WebForms
- Windows API
など
Step2:ターゲットを決定
LTS版を選択するのが一般的です。
※LTS版(Long Term Support)とは、長期間にわたって安全かつ安定してソフトウェアを利用できるよう、不具合修正やセキュリティ更新のサポートが保証されたバージョンのことです。
Step3:Upgrade Assistantを利用
Microsoft公式ツールがあります。
※Visual Studio 2022以降で利用できます。
環境によっては表示されない場合があります。
Step4:NuGetパッケージ更新
古いパッケージを最新化します。
Step5:コンパイルエラー解消
- System.Web → ASP.NET Core API
旧コード(.NET Framework)
using System.Web;
public string GetUserAgent()
{
return HttpContext.Current.Request.UserAgent;
}
新コード(.NET)
.NETでは System.Web が存在しないため、そのままではコンパイルできません。
public class SampleService
{
private readonly IHttpContextAccessor _httpContextAccessor;
public SampleService(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public string? GetUserAgent()
{
return _httpContextAccessor.HttpContext?
.Request.Headers["User-Agent"];
}
}
- HttpContext.Current → IHttpContextAccessor
旧コード(.NET Framework)
.NET Frameworkではどこからでも HttpContext.Current にアクセスできました。
public string GetLoginUser()
{
return HttpContext.Current.User.Identity.Name;
}
新コード(.NET)
.NETではDI(Dependency Injection)を利用して取得します。
builder.Services.AddHttpContextAccessor();
public class UserService
{
private readonly IHttpContextAccessor _httpContextAccessor;
public UserService(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public string? GetLoginUser()
{
return _httpContextAccessor.HttpContext?.User?.Identity?.Name;
}
}
- app.config → appsettings.json
旧コード(.NET Framework)
<appSettings>
<add key="ApiUrl" value="https://api.example.com" />
</appSettings>
string apiUrl = ConfigurationManager.AppSettings["ApiUrl"];
新コード(.NET)
{
"ApiUrl": "https://api.example.com"
}
public class SampleService
{
private readonly IConfiguration _configuration;
public SampleService(IConfiguration configuration)
{
_configuration = configuration;
}
public string GetApiUrl()
{
return _configuration["ApiUrl"];
}
}
Step6:テスト実施
- 単体テスト
- 結合テスト
- 性能テスト
- 画面確認
十分な検証を行ってから本番環境へ展開します。
おわりに
.NET Frameworkから.NETへの移行は、単純なバージョンアップではなく、アプリケーション基盤そのものの移行です。
しかし近年はUpgrade Assistantなどの支援ツールが充実しており、以前と比べて移行のハードルは大きく下がっています。
一方で、
- WebForms
- WCF
- System.Web
- 古いサードパーティライブラリ
などは移行時の注意点となるため、事前調査が重要です。
まずはライブラリや依存関係の棚卸しを行い、「本当に移行できるか」を確認することから始めるとよいでしょう。
特に業務システムでは、「コンパイルが通ること」よりも「既存機能が正しく動作すること」が重要です。
ツールによる変換をゴールにするのではなく、最終的な品質確認まで含めて移行計画を立てることが成功のポイントです。







