.NET 言語で記述されたすべてのコードは MSIL にコンパイルされますが、MSIL を直接使用しないと実行できない特定のタスク/操作はありますか?
また、C#、VB.NET、F#、j#、またはその他の .NET 言語よりも MSIL の方が簡単に処理できるようにしましょう。
これまでのところ、次のようになっています。
- 末尾再帰
- Generic Co/Contravariance (C# 4 および VB 10 で許可)
- 戻り値の型だけが異なるオーバーロード
- アクセス修飾子をオーバーライドする
- System.Object から継承できないクラスがある
- フィルタリングされた例外 (VB および C# 6 で許可)
- 現在の静的クラス型の仮想メソッドを呼び出しています。
- ボックス化されたバージョンの値型のハンドルを取得します。
- 試行/障害を実行します。
- 禁止された名前の使用。
- 値の型に対して独自のパラメーターなしのコンストラクターを定義します。
- 要素でイベントを定義します
raise
。 - 一部の変換は CLR では許可されていますが、C# では許可されていません。
- 非
main()
メソッドを として作成し.entrypoint
ます。 - ネイティブ
int
およびネイティブunsigned int
型を直接操作します。 - 一時的なポインターで遊ぶ
- MethodBodyItem の emitbyte ディレクティブ
- System.Exception 以外の型をスローしてキャッチする
- 列挙型を継承する (未確認)
- バイト配列を (4 倍小さい) int 配列として扱うことができます。
- フィールド/メソッド/プロパティ/イベントをすべて同じ名前にすることができます(未確認)。
- 独自の catch ブロックから try ブロックに戻ることができます。
- famandassem アクセス指定子にアクセスできます (
protected internal
famまたはassem ですが、C# 7.2 および VB 15.5 では許可されています)。 <Module>
グローバル関数またはモジュール初期化子を定義するためのクラスへの直接アクセス。- 非ゼロ バインドの 1 ベースの配列を作成して使用する
- オープン インスタンスとクローズド静的デリゲート、およびゲッター/セッターのデリゲートを作成する
- 一時変数を使用せずに 2 つの値を交換する
- 任意の名前での明示的なインターフェイスの実装、および 2 つのインターフェイス関数の 1 つの実装 (VB で実行可能)
- 宣言
vtfixup
(extern
C に相当) - 任意
modopt
または指定modreq