「管理対象」と「非管理対象」の違い


138

「マネージコード」や「アンマネージコード」など、.NETについて話すとき、時々聞いたり読んだりしますが、それらが何であり、それらの違いは何なのかわかりません。定義上、それらの違いは何ですか?それらのいずれかを使用した結果は何ですか?この違いは.NET / Windowsにのみ存在しますか?


回答:


190

マネージコード

マネージコードは、Visual Basic .NETおよびC#コンパイラが作成するものです。CLR(共通言語ランタイム)で実行されます。CLRは、ガベージコレクション、ランタイム型チェック、参照チェックなどのサービスを提供します。したがって、「私のコードはCLRによって管理されている」と考えてください。

Visual BasicとC#はマネージコードしか生成できないため、これらの言語のいずれかでアプリケーションを作成している場合は、CLRによって管理されているアプリケーションを作成しています。Visual C ++ .NETでアプリケーションを作成している場合は、必要に応じてマネージコードを生成できますが、これはオプションです。

アンマネージコード

アンマネージコードは、マシンコードに直接コンパイルされます。したがって、その定義により、従来のC / C ++コンパイラーによってコンパイルされたすべてのコードは「アンマネージコード」です。また、中間言語ではなくマシンコードにコンパイルされるため、移植性はありません。

無料のメモリ管理など、CLRが提供するものはありません。

Visual BasicまたはVisual C#ではアンマネージコードを作成できないため、Visual StudioではすべてのアンマネージコードがC / C ++で記述されています。

2つを混ぜる

Visual C ++はマネージコードまたはアンマネージコードのいずれかにコンパイルできるため、同じアプリケーションで2つを混在させることができます。これは2つの間の線をぼかし、定義を複雑にしますが、たとえば、不適切に記述されたアンマネージコードを含むサードパーティのライブラリを使用している場合でも、メモリリークが発生する可能性があることを知っておく価値があります。

これがグーグルで見つけた例です:

#using <mscorlib.dll>
using namespace System;

#include "stdio.h"

void ManagedFunction()
{
    printf("Hello, I'm managed in this section\n");
}

#pragma unmanaged
UnmanagedFunction()
{
    printf("Hello, I am unmanaged through the wonder of IJW!\n");
    ManagedFunction();
}

#pragma managed
int main()
{
    UnmanagedFunction();
    return 0;
}

11
「Visual BasicまたはC#ではアンマネージコードを作成できないため、すべてのアンマネージコードはC / C ++で記述されています。」ご存知のように、C、C ++、C#、VB以外の言語もあります。Delphiを使用して、アンマネージコードを記述します。また、マネージコード(.NET)とアンマネージコード(Win32)の明らかな違いの1つは、前者はすべての.NET関数を使用できるのに対し、後者はネイティブのWindows APIを使用することです。
Andreas Rejbrand 2010

22
「管理対象」および「管理対象外」という用語は、マシンコードとIRを区別するために考案されました。したがって、それらは本当に.NETのコンテキストでのみ意味を持ちます。Linuxカーネルもアンマネージコードにコンパイルされますが、それは議論にはあまり関係ありません。
kurige

6
これは話題から外れていますが、私のポイントは、Delphiでマネージコードを作成するオプションがないため、Delphiでアンマネージコードを作成することは非常に冗長であることを示しています。いずれにせよ、私は問題のある文に「ビジュアルスタジオで」を追加しました。また、誤植を指摘してくれてありがとう。どういうわけか、2回目のリードスルーでもそれを逃しました。
kurige

単なる説明として、C#でアンマネージコード("安全でない"コードと呼ばれる)を作成することは可能です
Basic

2
@JacksonTale Javaは.NETのコンテキストにはないため、管理または非管理という概念は適用されません。Javaのコンパイル方法の説明については、stackoverflow.com / questions / 1326071 /…を参照してください。
エヴァンフリッシュ2015年

84

これは、.NETおよびWindowsよりも一般的です。マネージドとは、自動メモリ管理、ガベージコレクション、タイプセーフなどの環境です。アンマネージド以外はすべてです。たとえば、.NETは管理された環境で、C / C ++は管理されていません。


この定義により、JavaScriptもアンマネージコードになりますよね?
ハンプトンテリー

@HamptonTerry Javascriptには、自動メモリ管理、ガベージコレクション、タイプセーフがあります。JavaScriptは管理されています。
Sancarn

13

マネージコードは、共通言語ランタイム仮想マシン(結果としてバイトコードが生成される)の「管理」の下でのみ必要であり、実行されるコンピュータープログラムコードを識別するためにMicrosoftが作成した差別化です。

http://en.wikipedia.org/wiki/Managed_code

http://www.developer.com/net/cplus/article.php/2197621/Managed-Unmanaged-Native-What-Kind-of-Code-Is-This.htm


1
はい。この回答に追加すると、マネージコードは、.NET関数を使用して、通常(たとえばC#で).NETで記述するコードです。一方、ネイティブWindows API(おそらく任意の言語で記述されたC)を使用するネイティブWindowsアプリケーションは、「管理対象外」です。
Andreas Rejbrand 2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.