"マネージド コード" とは

.NET を使用していると、よく "マネージド コード" という用語を目にすることがあります。 この記事では、"マネージド コード" の意味について説明し、それに関する追加情報を提供します。

簡単に言うと、マネージド コードとは、その実行がランタイムによって管理されるコードです。 この場合、問題のランタイムは、実装 (Mono、.NET Framework、.NET Core/.NET 5+ など) に関係なく、共通言語ランタイムまたは CLR と呼ばれます。 CLR は、マネージド コードを取得し、それをマシン コードにコンパイルしてから実行します。 それに加えて、ランタイムは、自動メモリ管理、セキュリティ境界、タイプ セーフなどのいくつかの重要なサービスも提供します。

これを、"アンマネージ コード" とも呼ばれる C/C++ プログラムを実行する方法と比較します。 アンマネージ環境では、プログラマがほとんどすべてのことを担当します。 実際のプログラムは、基本的に、オペレーティング システム (OS) がメモリに読み込み、起動するバイナリです。 メモリ管理からセキュリティの考慮事項まで、他のすべてのことをプログラマが担当します。

マネージド コードは C#、Visual Basic、F# など、.NET 上で実行可能な高水準言語のいずれかで記述されます。 それらの言語で書かれたコードをそれぞれのコンパイラでコンパイルした場合、マシン コードは得られません。 中間言語コードが得られ、それをランタイムがコンパイルして実行します。 C++ は、Windows で実行するネイティブなアンマネージ バイナリも生成できるため、この規則の 1 つの例外です。

中間言語と実行

"中間言語" (または略して IL) とは それは、高水準 .NET 言語で記述されたコードのコンパイルの成果物です。 これらの言語のいずれかで記述されたコードをコンパイルすると、IL で構成されたバイナリが得られます。 IL はランタイムで実行される特定の言語に依存しないことに注意してください。それについて個別の仕様もあるため、参照することができます。

高水準コードから IL を生成したら、ほとんどの場合、それを実行したいと考えるでしょう。 ここで、CLR が引き継ぎ、コードを IL から、CPU で実際に実行できるマシン コードに Just-In-Time コンパイル、つまり JIT 処理するプロセスを開始します。 このように、CLR ではコードが実行することを正確に把握しているため、それを効率的に管理できます。

中間言語は、Common Intermediate Language (CIL) または共通中間言語 (CIL) と呼ばれることもあります。

アンマネージ コードの相互運用性

もちろん、CLR は、マネージド環境とアンマネージド環境間の境界を越えることができ、.NET クラス ライブラリにも、それを行うコードは多数あります。 これは "相互運用性 (interoperability)" または略して "相互運用 (interop)" と呼ばれます。 これらのプロビジョニングにより、たとえばアンマネージ ライブラリをラップし、それを呼び出すことができます。 ただし、これを実行すると、コードがランタイムの境界を越えたときに、実行の実際の管理が再びアンマネージ コードの担当になるため、同じ制限が課せられることになります。

これと同様に、C# は、実行が CLR によって管理されないコードの一部を指定する "アンセーフ コンテキスト" として知られる機能を使用して、コード内の直接のポインターなど、アンマネージド コンストラクトを使用できる 1 つの言語です。

その他のリソース