.NET Framework の新元号対応予定について

皆様、こんにちは。

今回は、.NET Framework の新元号対応に関わる変更について、変更の内容とリリース予定についてご案内します。

 

変更内容

現在、マイクロソフトでは .NET Framework のクラス ライブラリの新元号対応に関して以下の 2 点の変更を予定しています。

変更 1.

各元号における最終年を超えた和暦表現の文字列 (平成 32 年、昭和 65 年など) を日付型オブジェクトに変換する際の緩和措置

変更 2.

.NET Framework 3.5 においても、和暦計算時に元号情報のレジストリを参照するような変更

 

それぞれの詳細について、以下にご案内します。

 

 

変更 1. について

.NET Framework では、System.DateTime.Parse メソッドや VisualBasic の CDate 関数など、和暦表現の文字列を DateTime などの日付関連のオブジェクトに変換する処理において、”昭和65年1月1日” のような各元号の最終年を超える日付に対しては、System.FormatException やSystem.InvalidCastException といった例外をスローする動作となっていました。

今回、元号のレジストリが追加されたことによって .NET Framework でも平成は 31 年が最終年であると認識するようになりますが、これにより、レジストリが追加される前までは問題なく処理されていた “平成32年1月1日” といった和暦表現の入力も例外を発生させてしまうことが想定されます。

しかしながら、昭和65年や平成32年といった表現は、法令上無効なものではなく、本来は例外をスローすることなく処理されるべきものでした。

これを踏まえ、本変更にて “平成32年1月1日” や ”昭和65年1月1日” といった和暦表現に対しても例外をスローせずに正しく処理するよう修正が加えられました。

 

なお、上記のような動作を望まないアプリケーションに対しては、更新プログラムの適用後でも、以下のような設定を適用することで、従来の動作と同様に例外をスローさせることが可能となっています。

 

- .NET Framework 4.6 以降のアプリケーションで変更 1. の動作を無効化する方法

アプリケーション構成ファイル (***.exe.config) の <runtime> 要素に、以下のような <AppContextSwitchOverrides> 要素を記述します。

本設定は .NET Framework 4.6 から提供されている AppContext の機能を使用して本変更をオプトアウトするもので、アプリケーションごとに設定可能です。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <runtime>
           <AppContextSwitchOverrides value="Switch.System.Globalization.EnforceJapaneseEraYearRanges=true" />
    </runtime>
</configuration>

 

- .NET Framework 4.5.2 以前のアプリケーションで変更 1. の動作を無効化する方法

以下のレジストリ値を設定します。本設定は対象のシステム上で動作するすべての .NET Framework 4.5.2 以前のアプリケーションに対して本変更を無効化します。

キー : HKEY_LOCALMACHINE\SOFTWARE\Microsoft\.NETFramework\AppContext
名前 : Switch.System.Globalization.EnforceJapaneseEraYearRanges
種類 : REG_SZ
データ : 1

 

変更 2. について

.NET Framework では、これまで、西暦に対応する和暦の算出方法がバージョンによって以下のように異なっていました。

.NET Framework 3.5 (2.0/3.0 も含む)

モジュールにハードコードされた情報をもとに算出

.NET Framework 4 以降

レジストリ (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras) に定義された情報をもとに算出

 

このため、Windows 10 April 2018 Update で追加されたように、上記のレジストリに新しい元号の情報が追加されたとしても、.NET Framework 3.5 アプリケーションではその情報が利用されることはありませんでした。

本変更では、.NET Framework 3.5 についても .NET Framework 4 以降と同様に、上記のレジストリを参照して和暦を算出できるよう修正が加えられています。

これにより、各種書式関数における和暦の処理や、System.Globalization.JapaneseCalendar クラスの GetEra メソッドや Eras プロパティなども、上記レジストリの情報に基づいて処理を行うようになります。

 

 

リリース予定について

上述の変更 1. および 変更 2. について、Windows 10 April 2018 Update を対象として (*1)、以下のスケジュールにてリリースを予定しています。

 

6/26 ( ) 7/10 ( )
変更 1. Optional の更新 (*2) 重要な更新 (*3)
変更 2. Optional の更新 (*2) 更新には含めず取り下げ (*4)

※ 日付はいずれも米国時間です

 

(*1) Windows 10 April 2018 Update 以外の OS に対しても順次更新が提供される予定です。提供予定が決まり次第、本ブログでご案内します。

(*2) 6/26 リリース予定の更新プログラムは重要な更新として自動的にインストールされるものではなく、Windows 10 のサービス チャネルで  Insider Program を利用されている端末に対してのみ配信されるものとなっています。これ以外の端末で個別にインストールするには Microsoft Update Catalog からインストーラーを入手するか、[設定] - [Windows Update の設定] から [更新プログラムのチェック] を明示的に実行する必要があります。

また、配信される更新プログラムの KB 番号としては、本稿の執筆時点では KB4284848 の割り当てが予定されています。Microsoft Update Catalog から入手する場合は、この KB 番号でサーチを行ってください。KB 番号に変更があった場合には、本ブログでご案内する予定です。

(*3) 7/10 リリース予定の更新プログラムは重要な更新として自動的にインストールされます。

(*4) 変更 2. が現時点で適用された場合、.NET Framework 3.5 上で動作するアプリケーションへの影響が懸念されるというフィードバックを多くいただいたことから、特別措置として、変更 2. の修正は 7 月、8 月の更新プログラムに含めないことを決定しました。9 月以降の予定は未定ですが、予定が決まり次第、本ブログでご案内します。

 

 

ご留意いただきたい点について

上述の、6/26 (米国時間) にリリースを予定している Optional の更新プログラムをインストールした場合、.NET Framework 3.5 上で動作する和暦を扱うアプリケーションの動作に影響が生じる可能性があります。

本更新プログラムは通常ご利用いただいている環境に自動的にインストールされることはありませんが、.NET Framework 3.5 上で動作し和暦を扱うアプリケーションを使用されている場合は、本更新プログラムを個別にインストールすることはお控えいただくか、Windows 10 April 2018 Update で追加された元号のレジストリ削除していただくようお願いします。

アプリケーションの開発者様は、本更新プログラムを適用することで .NET Framework 3.5 上で動作するアプリケーションで改元の影響を評価していただけますので、ご活用いただけると幸いです。