.NET 5 じゃなくても C# 9.0 をできる限り使いたい!そんなあなたのために「.NET 5 未満でも」シリーズ第 2 弾。第 1 弾はこちら。
今回はタイトルにある通りモジュール初期化子についてですが、それ自体の用途や詳細挙動は岩永さんのサイトに譲ります。
.NET 5 未満でモジュール初期化子を有効化
モジュール初期化子は ModuleInitializerAttribute
を以下の条件を満たすメソッドに付与することで利用できます。
- 引数なし
- 戻り値なし
static
メソッドpublic
/internal
のどちらかのアクセシビリティ- 非 Generics
逆に言うと ModuleInitializerAttribute
をプロジェクト内で用意してあげればコンパイラは解釈できることになります。ということで、準備しましょう。プロジェクト内に閉じるだけであれば internal
型でも問題ありません。
#if !NET5_0_OR_GREATER // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Method, Inherited = false)] internal sealed class ModuleInitializerAttribute : Attribute { } } #endif
あとは C# 9.0 を明示的に有効化すれば OK です。第 1 弾で紹介した init
の有効化の方法と全く同じですね。積極的に (?) コンパイラをハックしていきましょう!
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <!-- これで .NET 5 以外のターゲットに対しても init が有効になる --> <TargetFrameworks>netstandard2.0;netstandard2.1;net461;net5</TargetFrameworks> <LangVersion>9.0</LangVersion> </PropertyGroup> </Project>