web-dev-qa-db-ja.com

プログラミングにおけるマネージコードまたはアンマネージコードとは何ですか?

C#コードで特定のコマンドを使用していますが、これはうまく機能します。ただし、「アンマネージド」コードでは不正な動作をすると言われています。

マネージコードまたはアンマネージコードとは何ですか?

140
Pokus

アンマネージコード に関するMSDNのテキストを次に示します。

一部のライブラリコードは、アンマネージコードを呼び出す必要があります(たとえば、Win32などのネイティブコードAPI)。これはマネージコードのセキュリティ境界の外に出ることを意味するため、十分な注意が必要です。

マネージコードに関するその他の補足説明を次に示します。

  • CLRによって実行されるコード。
  • .NET Frameworkの基盤である共通言語ランタイムを対象とするコードは、マネージコードと呼ばれます。
  • マネージコードは、CLRがメモリ管理、言語間の統合、コードアクセスセキュリティ、オブジェクトの自動ライフタイム制御などのサービスを提供するために必要なメタデータを提供します。 ILに基づくすべてのコードは、マネージコードとして実行されます。
  • CLI実行環境で実行されるコード。

あなたの問題について:

これは、NUnitがUnitTestingのコードを実行し、管理されていない部分がある可能性があるためだと思います。しかし、私はそれについて確信がありませんので、金のためにこれを受け取らないでください。誰かがそれについてあなたにもっと情報を提供できると確信しています。それが役に立てば幸い!

70

これ は、主題に関する良い記事です。

要約する、

  1. マネージコードは、マシンコードにコンパイルされるのではなく、マシン上のサービスによって解釈および実行される中間言語にコンパイルされるため、(うまくいけば!)メモリやスレッドなどの危険なものを処理する安全なフレームワーク。現代の使用では、これは頻繁に.NETを意味しますが、そうする必要はありません。

同じマシンにインストールされているランタイムエンジン内で実行されるアプリケーションプログラム。アプリケーションはそれなしでは実行できません。ランタイム環境は、プログラムが使用し、通常はメモリ管理を実行するソフトウェアルーチンの一般的なライブラリを提供します。また、ソースコードから実行可能コードへ、または中間言語から実行可能コードへのジャストインタイム(JIT)変換も提供します。 Java、Visual Basic、および.NETの共通言語ランタイム(CLR)は、ランタイムエンジンの例です。 ( 続きを読む

  1. アンマネージコードはマシンコードにコンパイルされるため、OSによって直接実行されます。したがって、マネージコードにはない、有害な/強力なことを実行する機能があります。これがすべての動作方法であるため、通常は.dllなどの古いものに関連付けられています。

単独で実行される実行可能プログラム。オペレーティングシステムから起動されたプログラムは、オペレーティングシステムのソフトウェアルーチンを呼び出して使用しますが、別のソフトウェアシステムを使用する必要はありません。マシン言語にアセンブルされたアセンブリ言語プログラム、および特定のプラットフォーム用にマシン言語にコンパイルされたC/C++プログラムは、アンマネージコードの例です。( 続きを読む

  1. Nativeコードは多くの場合Unmanagedと同義ですが、同一ではありません。
186
annakata

nmanagedを考えるときは、マシン固有のマシンレベルのコードを考えてください。 x86アセンブリ言語と同様。アンマネージ(ネイティブ)コードはコンパイルされ、リンクされて、設計されたプロセッサ上で直接実行されますが、現時点ではすべてのOSを除きます。ポータブルではありませんが、高速です。非常にシンプルな、必要最小限のコード。

Managedコードは、Javaから古いInterpretive BASIC、または.NETで実行されるものまですべてです。マネージコードは通常、中間レベルのPコードまたはバイトコードの命令セットにコンパイルされます。これらはマシン固有の命令ではありませんが、アセンブリ言語に似ています。マネージコードは、実行中のマシンからプログラムを隔離し、すべてのメモリが間接的に割り当てられる安全な境界を作成します。一般的に、ポート、メモリアドレススペース、スタックなどのマシンリソースに直接アクセスすることはできません。 。考え方は、より安全な環境で実行することです。

管理変数から管理されていない変数に変換するには、実際のオブジェクト自体に到達する必要があります。おそらく、追加のパッケージに包まれているか、箱に入れられています。アンマネージ変数( 'int'など)-32ビットマシンでは、正確に4バイトかかります。オーバーヘッドや追加のパッケージはありません。マネージコードからアンマネージコードに移行するプロセスは、「marshaling」と呼ばれます。プログラムが境界を越えることができます。

65
TJPowell

できるだけ少ない言葉で:

  • マネージコード= .NETプログラム
  • アンマネージコード=「通常の」プログラム
22
Vilx-

基本的にアンマネージコードは、.NET CLR(別名VB.NET、C#などではない)で実行されないコードです。私の推測では、NUnitには.NETコード(別名C++)ではないランナー/ラッパーがあります。

4
joegtp

マネージコード:
共通言語ランタイムとの「協力契約」の下で実行されるコード。マネージコードは、メモリ管理、言語間の統合、コードアクセスセキュリティ、オブジェクトの自動ライフタイム制御などのサービスを提供するためにランタイムに必要なメタデータを提供する必要があります。 Microsoft中間言語(MSIL)に基づくすべてのコードは、マネージコードとして実行されます。

管理されていないコード:
共通言語ランタイムの規則と要件に関係なく作成されるコード。アンマネージコードは、最小限のサービス(ガベージコレクションなし、制限されたデバッグなど)を使用して、共通言語ランタイム環境で実行されます。

参照: http://www.dotnetspider.com/forum/11612-difference-between-managed-and-unmanaged-code.aspx

4
GMalla

NUnitは個別のAppDomainでユニットテストをロードしますが、エントリポイントが呼び出されていない(おそらく必要ない)ため、エントリAssemblyがnullであると想定しています。

3
leppie

マネージコードはCLR(.NETランタイム)の環境内で実行されます。要するに、すべてのILはマネージコードです。言語のソースコードの実行。

2
chirag Makwana

管理コードは、C#.Net、VB.Net、F#.Netなどのコンパイラーが作成するものです。 CLRで実行されます。CLRは、特にガベージコレクション、参照チェックなどのサービスを提供します。 つまり、私のコードはCLRによって管理されていると考えてください。

一方、nmanaged codeは、マシンコードに直接コンパイルされます。 CLRでは管理しません。

2
Arif

マネージコード:-MSIL(中間言語)形式のコードは、言語コンパイラのコンパイル後に開発され、マネージコードと呼ばれるCLRによって直接実行されます。例:-.netフレームワークでサポートされている61の言語コードすべて

アンマネージコード:-MSILフォームが利用できない.net以前に開発されたコードで、CLRによって直接実行されるのではなく、CLRがオペレーティングシステムにリダイレクトされます。

例:-COM、Win32 API

1
Ashok Narwal
  • 管理コード:C#、VB.NETなどの.NET言語で記述されたコード。
  • nManagedコード:.NET言語で記述されていないコードで、MSILはそれが何であるかを理解せず、CLRで実行できません。 .NET言語で作成されていない.NETアプリケーションで使用したサードパーティ製コントロールのように。
1
Saket Kumar

.NET frameworkMicrosoftMFC (Visual C++), VB, FoxProなどのスタンドアロン製品を提供する前に、まずこれを理解してください。

2002年に、マイクロソフトは製品を組み合わせて.NETフレームワークを作成しました。ここで、以前にコードが実行された方法と、.NETフレームワークでコードが管理および実行される方法に違いがあります。マイクロソフトは、.NETフレームワークのCLRの概念を導入しました。これは、.NETフレームワークのサポートされているラナグーからのコードをコンパイルし、memory mangement, garbage collectionなどの追加機能を提供します。

したがって、.NETフレームワーク(CLRでコンパイル)でライブラリ/コードを作成する場合、Managed codeと呼ばれます。このライブラリを他の.NETアプリケーション/プロジェクトでさらに使用することができます。また、CLRはそれが以前にどのようにコンパイルされたかを理解するため、管理コードのままです。

OTOH .NETフレームワークより前に作成されたライブラリを使用する場合は、特定の制限を課すことができますが、その時点ではCLRがなかったため、CLRがこのコードを再度理解してコンパイルすることはできません。 。そして、これはunmanaged codeと呼ばれます。 CLR互換でない場合、特定の機能/ツールを提供するためにサードパーティによって作成されたライブラリ/アセンブリも非管理コードと見なされる場合があることに注意してください。

素人の用語では、Manage codeは、CLRが理解し、さらに実行するために独自にコンパイルできるものです。 .NETフレームワークでは、(。NETフレームワークで動作する任意の言語から)コードがCLRに渡されると、コードがメタデータ情報を提供するため、CLRは指定された機能を提供します here 。それらのいくつかはGarbage collection, Performance improvements, cross-language integration, memory managementなどです。

OTOH、アンマネージコードは、マシン固有のものであり、すぐに使用できるため、さらに処理する必要はありません。

0
Amnesh Goel

Pro C#5および.NET 4.5 Frameworkから:

マネージコードとアンマネージコード: C#言語について理解する最も重要なポイントは、.NETランタイム内でのみ実行できるコードを生成できることです(C#を使用してネイティブCOMを構築することはできません)サーバーまたはアンマネージC/C++アプリケーション)。公式には、.NETランタイムを対象とするコードを表す用語はマネージコードです。マネージコードを含むバイナリユニットは、アセンブリと呼ばれます(アセンブリの詳細については、後ほど説明します)。逆に、.NETランタイムで直接ホストできないコードは、アンマネージコードと呼ばれます。

0
arush436