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


150

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

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


回答:


75

これは、アンマネージコードに関するMSDNからのテキストです

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

マネージコードに関するその他の補足説明は次のとおりです。

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

あなたの問題について:

それは、NUnitがUnitTestingのコードを実行し、その一部が管理されていない可能性があるためだと思います。しかし、私はそれについて確信が持てないので、これを金と考えないでください。誰かがあなたにそれについてもっと多くの情報を与えることができると確信しています。それが役に立てば幸い!


12
あなたの答えに入る努力に感謝します。しかし、「マネージコード」が何であるかを知らない人は、あなたの答えであなたが何を意味するのかと苦労します:彼らは、「ライブラリコード」、「アンマネージコード」、「ネイティブコードAPI」、CLR、 .netフレームワークの基礎、IL、CLI実行環境など
BKSpurgeon 2016

200

これは主題についてのよい記事です。

要約する、

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

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

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

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

  1. 多くの場合、ネイティブコードはアンマネージドと同義ですが、同一ではありません。

ハッキングでは.net langauge(C#、C ++)を使用できないということですか?
Haroon A.

7
@H_wardak「ハッキング」とは何ですか?これは非常に一般的な用語で、NORADへのハッキングと一部のレジスタのハッキングは同じであると言っているようなものです。
Alex

7
インタビュアーから一度尋ねられましたが、アンマネージコードをC#で実行/作成できますか?誰でもこれを手伝ってくれる?
RSB

9
@RSB:アンマネージコードをC#で作成することはできません(ただし、アンマネージコードをC#から直接呼び出すことはできます)。理論的には、適切なコンパイラとフレームワークがあれば、それは可能だと思います。実際には、C#をコンパイルしてコードを直接マシンで処理できるコンパイラが必要です。それがどのように機能するかわかりません。
James Haug 2017

67

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

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

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


1
それでは、マシャリングは値と参照型とどのように相互作用しますか?たとえば、MarshalByRefObjectについて何かを見た覚えがあります。
カイルバラン2013年

24

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

  • マネージコード= .NETプログラム
  • アンマネージコード= "通常の"プログラム

16
.NETプログラムは「正常」ではないのですか?
jtate 2017年

1
@jtate-そうですね、はい。:)私はそれをより直感的にしようとしました。とにかく、今から8年以上前のことです。日常的に一般的に使用されている無数のプログラミング言語がある今日、この違いは確かにさらに不正確です。
Vilx- 2017年

5

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

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


4

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


4

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

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

リファレンス:http : //www.dotnetspider.com/forum/11612-difference-between-managed-and-unmanaged-code.aspx


3

NUnitは単体テストを別のAppDomainにロードし、エントリーポイントが呼び出されていない(おそらく必要ない)と想定しているため、エントリーアセンブリはnullです。


2

マネージコードはCLRの環境内で実行されます。つまり、.NETランタイムです。つまり、すべてのILはマネージコードですが、サードパーティソフトウェアの例VB6またはVC ++コンポーネントを使用している場合は、.NETランタイム(CLR)が制御できないため、アンマネージコードです。言語のソースコードの実行。


1

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

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

例:-COM、Win32 API


この投稿には多くの誤りがあります。最も明らかにMISL(つまり、MSIL)。
Matt Seymour

1
  • マネージコード:C#、VB.NETなどの.NET言語で記述されたコード。
  • アンマネージコード:.NET言語で記述されていないコードであり、MSILはそれが何であるかを理解せず、CLRで実行できません。.NET言語で作成されていない、.NETアプリケーションで使用したサードパーティのコントロールと同様です。

0

まず、これは、以前.NET frameworkMicrosoftスタンドアロンの製品MFC (Visual C++), VB, FoxProなどを提供していたことを理解しています。

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

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

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

簡単に言えば、ManageコードはCLRが理解できるものであり、さらに実行するために独自にコンパイルできます。.NET Frameworkでは、(。NET Frameworkで動作する任意の言語から)コードがCLRに渡されると、コードがメタデータ情報を提供するため、CLRはここで指定され機能を提供できます。それらのいくつかはGarbage collection, Performance improvements, cross-language integration, memory management等です。

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


たくさんの無知な意見がたくさんあります、私は恐れています。これは驚くかもしれませんが、CLRはアンマネージコード(通常はC ++ / CLIで記述)も実行できます。マネージコードをILとして利用できるようにする必要もありません。.NET Nativeはしばらく前から存在しており、コンパイル済みのアセンブリが付属しています。あなたが"CLR互換"と呼んだものは、おそらく"CLS準拠"であることを意味しています。CLSへの準拠に失敗しても、マネージコードが突然アンマネージになるわけではありません。説明にかかわらず、アンマネージコードの使用も非常に簡単です(RCW over COM、P / Invoke、C ++ / CLIなど)。
IInspectable 2015

0

Pro C#5と.NET 4.5 Frameworkから:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.