web-dev-qa-db-ja.com

マネージコードとアンマネージコード、メモリ、サイズの違いは何ですか?

マネージドコードとアンマネージドコードについて多くのことを聞いて、マネージドはCLRについてであり、アンマネージドはCLRの外にあるという唯一の違いを知った後、それを詳細に知りたいと思います。マネージコードとアンマネージコード、メモリ、およびサイズとは何ですか?

C#コードである間にC#で記述するコードをアンマネージする方法と、サイズのメモリがアンマネージされる方法を教えてください。例と少しの洞察が役立ちます。

67
Simsons

短い答え:

  • マネージコードは.NETコード(VB.NET、C#など)であり、.NETコードを記述してコンパイルします [〜#〜] cil [〜#〜]
  • アンマネージコードは、.NETの下にないコードで、直接マシンコードにコンパイルされます。

長い答え:

マネージコードとは

マネージコードは、Visual Basic .NETおよびC#コンパイラが作成するものです。コンピューターで直接実行できるマシンコードではなく、中間言語(IL)にコンパイルされます。 CILは、作成したコードのクラス、メソッド、および属性(セキュリティ要件など)を記述するメタデータとともに、アセンブリと呼ばれるファイルに保持されます。このアセンブリは、.NETの世界における展開のワンストップショッピングユニットです。別のサーバーにコピーしてアセンブリを展開します。多くの場合、そのコピーが展開に必要な唯一の手順です。

マネージコードは、共通言語ランタイムで実行されます。ランタイムは、実行中のコードにさまざまなサービスを提供します。通常の一連のイベントでは、最初にアセンブリを読み込んで検証し、CILが正常であることを確認します。その後、ちょうど間に合うように、メソッドが呼び出されると、ランタイムはアセンブリが実行されているマシンに適したマシンコードにコンパイルされるようにアレンジし、メソッドが次回呼び出されるときに使用されるこのマシンコードをキャッシュします。 (これはJust In Time、またはJITコンパイル、または単にJittingと呼ばれます。)

アセンブリが実行されると、ランタイムはセキュリティ、メモリ管理、スレッド化などのサービスを提供し続けます。アプリケーションはランタイムによって管理されます。

Visual Basic .NETおよびC#は、マネージコードのみを生成できます。これらのアプリケーションを使用している場合、マネージコードを作成しています。 Visual C++ .NETは、必要に応じてマネージコードを生成できます。プロジェクトを作成するとき、.Managed C++アプリケーションなど、.Managed。で始まる名前のアプリケーションタイプの1つを選択します。

アンマネージコードとは

アンマネージコードは、Visual Studio .NET 2002がリリースされる前に作成するために使用するものです。 Visual Basic 6、Visual C++ 6、一体15年前のCコンパイラでさえ、ハードドライブをいじくり回している場合でも、すべてアンマネージコードが生成されていました。コンパイルしたマシンで実行されたマシンコードに直接コンパイルされました。同じチップまたはほぼ同じである限り、他のマシンでも実行されました。目に見えないランタイムからセキュリティやメモリ管理などのサービスを取得しませんでした。オペレーティングシステムから取得しました。そして重要なことは、通常Windows SDKで提供されているAPIを呼び出すことで、オペレーティングシステムから明示的に取得することです。最近のアンマネージアプリケーションは、COM呼び出しを通じてオペレーティングシステムサービスを取得しました。

Visual Studioの他のMicrosoft言語とは異なり、Visual C++はアンマネージアプリケーションを作成できます。プロジェクトを作成し、MFC、ATL、またはWin32で始まる名前のアプリケーションタイプを選択すると、アンマネージアプリケーションが作成されます。

これにより、混乱が生じる可能性があります。ManagedC++アプリケーションを作成すると、ビルド製品は.exe拡張子を持つCILのアセンブリになります。 MFCアプリケーションを作成すると、ビルド製品はネイティブコードのWindows実行可能ファイルであり、拡張子は.exeになります。 2つのファイルの内部レイアウトはまったく異なります。中間言語逆アセンブラーildasmを使用して、アセンブリーの内部を調べ、メタデータとCILを確認できます。 ildasmをアンマネージドexeに向けると、有効なCLR(Common Language Runtime)ヘッダーがなく、逆アセンブルできないことがわかります。同じ拡張子、まったく異なるファイルです。

ネイティブコードはどうですか?

ネイティブコードというフレーズは、2つのコンテキストで使用されます。多くの人は、アンマネージコードの同義語としてそれを使用します。古いツールでビルドされたコード、またはVisual C++で意図的に選択されたコード。ランタイムでは実行されず、マシンでネイティブに実行されます。これは完全なアプリケーションの場合もあれば、COMコンポーネントまたはDLLであり、COM InteropまたはPInvokeを使用してマネージコードから呼び出されている場合もあります。たとえば、マネージコードのコードアクセスセキュリティは、別のサーバーからのコードの読み込みを防止します。アプリケーションが別のサーバーからロードされたアンマネージコードを呼び出す場合、その保護は得られません。

ネイティブコードというフレーズの他の使用法は、JITコンパイラの出力、つまりランタイムで実際に実行されるマシンコードを記述することです。管理されていますが、CILではなく、マシンコードです。その結果、native = unmanagedとだけ仮定しないでください。

ソース

144
Shimmy

これは、Cコンパイラによって生成されるマシンコードと、マネージプログラムからJITコンパイラによって生成されるマシンコードの多くの微妙な違いについて話し合う、非常に長い答えになる可能性があります。本を本当に必要とするほど長いが、そのような本はすでに書かれている。例えば、ジェフリー・リヒターによるもの。

これらの微妙な違いはすべて1つのルールに要約されるため、短く簡潔に説明します。

マネージコードは、ガベージコレクションされたヒープからメモリを割り当てるコードです。

7
Hans Passant

マネージコードはアプリケーションドメインで実行され、アンマネージコードはオペレーティングシステムのプロセスの下で実行されます。

1

一般に、マネージコードは、同等の適切に作成された非マネージ(ネイティブ)コードよりもランタイムメモリのフットプリントが大きくなります。

1
seand

OSで直接実行されるアプリは、

管理されていないアプリ

一方、.netフレームワークで実行されるアプリは、

管理対象アプリ

0