2008-09-11 8 views
49

私は20年近くC/C++コードを書いてきました。私はPerl、Python、PHP、そしていくつかのJavaも知っており、JavaScriptを教えています。しかし、私は.NET、VB、またはC#のものを一度もやっていません。何が正確にコードを管理していますか?"マネージド"コードとは何ですか?

単に仮想マシン

の管理下に実行し、それが特異的Javaは(通常は)コードを管理し、その

  • されていることを述べている

    コードとしてウィキペディアdescribes itなぜこの用語はC#/ .NETにしか当てはまりませんか?

  • C#をVMを含む.exeにコンパイルできますか、それをパッケージ化して別の.exe(a la java)に付ける必要がありますか?同様の静脈で

  • は、.NET 言語またはフレームワークで、 "フレームワーク" は、ここで正確に何を意味するのでしょうか?

OK、それが複数の質問ですが、限り、私が持っているとして、業界ではされています誰かのために、私は今N00Bっぽいむしろ感じている...

+1

[C#で管理/非管理コードとは何ですか?](http://stackoverflow.com/questions/334326/what-is-managed-unmanaged-code-in-c) – nawfal

+0

Brad Adamsには[私が読んだベスト解説](http://blogs.msdn.com/brada/archive/2004/01/09/48925.aspx) – JamesSugrue

答えて

34

C#コードを.exeにコンパイルすると、Common Intermediate Language(CIL)バイトコードにコンパイルされます。 CIL実行可能ファイルを実行するたびに、MicrosoftのCLR(Common Language Runtime)仮想マシン上で実行されます。したがって、.NET実行可能ファイルにVMを含めることはできません。プログラムが実行されるすべてのクライアントマシンに.NETランタイムがインストールされている必要があります。

2番目の質問に答えるために、.NETはフレームワークであり、言語固有ではないライブラリ、コンパイラ、VMのセットです。したがって、C#、VB、C++、および.NETコンパイラを持つ他の言語で.NETフレームワークをコーディングすることができます。

https://bitbucket.org/brianritchie/wiki/wiki/.NET%20Languages

上記のページには、.NETのバージョンを持っている言語、並びにそれらのページへのリンクのリストを持っています。

+0

.NETでのコンパイルは2段階のプロセスなので、言語コンパイラ(たとえばC#コンパイラなど)によってILコードにコンパイルされたコードは、「マネージコード」とも呼ばれます。 –

+1

あなたの答えのリンクはもう役に立たない – overcomer

+0

リンクが変更されました:[こちら](https://bitbucket.org/brianritchie/wiki/wiki/.NET%20Languages) – Jude

0

.NETがされるように基本構想。 多くの言語(VB.NET、C#、IronPython、booなど)から使用できます。

.NETは常に解釈されて実行され、.exe内に 'VM'を含めることはできません。 .NETアプリケーションを実行するすべてのユーザーは、フレームワークがインストールされている必要があります。マイクロソフトは、用語を使用しているため

+0

あなたが言った事実はすべて間違っています。 – Jeremy

3

を管理する用語は、一般的にのみ、.NETに適用されます。マイクロソフトは一般に、.NET管理された実行環境に関して「仮想マシン」という用語を使用しません。

.NETの "バイトコード"(IL)は、管理された環境で実行する前にネイティブコードにコンパイルするように明示的に設計されている点でJavaバイトコードとは多少異なりますが、Javaは解釈されるように設計されています。プラットフォームに依存しないコードも同様です。

「.NET Frameworkには、」アプリケーションを開発するために使用できるクラスの数千人を含む、基本的に、マイクロソフトが提供するライブラリの巨大なセットです。

コンパイルされたC#の.exeがモノ含め、任意の.NET互換環境で実行することができるプラットフォームに依存しないコードを含んでいます。ただし、ランタイムは一般的に、それを使用するアプリケーションとは別に配布されます。

9

それはMicrosoftがC/C++およびその他の古い言語から.NETを区別するために選択した用語ですので、主に.NETを記述するために使用されます。 Microsoftは、C#/の類似点を強調したくないため、通常はJavaに関連付けられていた用語ではなかったため、これを選択しました。NETとJava(それは、Javaのように聞こえるようにする「仮想マシンコード」のようなものではない)。基本的に、「マネージコード」の使用は、技術的に駆動されるのではなくマーケティング主導の用語です。

1

.NETはフレームワークです。 Common Language Runtime(CLR)は、ソリューションのコンパイル時に生成されるMicrosoft中間言語(MSIL)コードを実行します(つまり、マシンコードにコンパイルされません)。あなたはexe内にAPIを含めることはできませんし、それはかなり大きいのでしたくありません。ここでの大きなメリットはメモリ管理(他のセキュリティ上の利点の中でも、私が知らないものなど)です。

1

私はフレームワークの質問に答えることができます。 .NETはフレームワーク、C#、VB.NETなどは言語です。基本的に.NETは、.NETを使用しているすべての言語が呼び出せるライブラリ(All System ... dlls)を呼び出すライブラリの共通プラットフォームを提供します。すべての.NET言語は、適切な.NETフレームワークがインストールされている任意のPCで実行できるMSIL(Microsoft Intermediate Language、単にILとも呼ばれます)にコンパイルされます。

3

Managedとは、コードがネイティブコードにコンパイルされていないことを意味し、仮想マシンの後ろで実行されます。 Javaはバイトコードと呼ばれる中間フォーマットにコンパイルされます。これは、Java VMが解釈および実行方法を認識しています。すべての.NET言語は、.NETランタイムが解釈するIL(中間言語)にコンパイルする同様のことを行います。 .NET ILには.dllと.exeファイルのエンディングがあるため、少し混乱します。

9

大部分は、すべてのメモリ割り当てが管理されているということです。マネージコードを使用している場合は、オブジェクトの終了時にオブジェクトを解放することについて心配する必要はありません。単に範囲外にすることができれば、VMは最終的にVMへの参照がなくなったことを認識し、メモリをシステムに戻すガベージコレクションを行います。

一方、非管理コードは、参照を破棄する前に明示的にポインタを解放しない限り、単に「リーク」します。

0

CPUによって直接ではなく仮想マシンによって実行されるコードを指すことができます。

ガベージコレクションや配列の境界チェックなどが可能になると思います。

2

一部の人は気になることがありますが、私は管理された単語がコンパイルされているのではなく、アンマネージドという言葉を使用できると考えています。管理されている間にもっと意味があるかもしれませんが、現実には、コンパイル時にコンパイルされたコードとコンパイルされたコードの間の違いを区別するのに使われるようです。

それとも、使用することを好む他の方法、置く:システムに制御不能なことを行うことが

a)にアンマネージコードを。

b)高速で堅牢で、OSに近いネイティブコンパイル済みコード。

もちろん、実際には同じものです。

6

具体的には、.NETとVisual C++では、アンマネージドコードとマネージドコードの両方を使用できます。用語は、メモリが割り当てられ、管理される方法を指す。

アンマネージドコードは、あなたが慣れ親しんだC++のものです。ダイナミックメモリ割り当てとメモリの明示的な解放。 .NETランタイムはあなたのためにメモリを管理しないため、「管理されていない」。

一方、管理コードは実行時に管理されます。必要に応じてメモリを割り当てます(メモリ空間ではなく変数を宣言します)。実行時ガベージコレクタは、不要になったときを判断し、すべてをクリーンアップします。ガベージコレクタはメモリを移動して効率を向上させます。ランタイムはそれをあなたのためにすべて「管理」します。

上記のとおり、管理対象と非管理対象の両方のコードを記述することができます。

非管理:管理

class Bar : public Foo { 
    private: 
      int fubar; 
    public: 
      Bar(int i) : fubar(i) {} 
      int * getFubar() { return * fubar; } 
} 

public ref class Bar : public Foo 
    private: 
      int fubar; 
    public: 
      Bar(int i) : fubar(i) {} 
      int^getFubar() { return^fubar; } 
} 

はREFに注意してください?これは、Managedクラスをかなり指定しています。しかし、2種類のコードを混在させると非常に混乱します。たとえば、ポインタのマネージに相当するリファレンスポインタ(^)をアンマネージクラス内のピクチャボックスコントロールに保存するとします。ガベージコレクタはメモリを移動することができるので、次にピクチャボックスを間接参照しようとすると見つからない場合があります。実行時に、管理されていないコードにメモリの変更に関する情報は表示されません。

したがって、アンマネージドコードで管理対象オブジェクトを追跡できるように、管理対象オブジェクトをメモリにピンダウンする必要があります。その後、アンボクシングと、2つを混在させることができる他のすべての種類のクォークがあります。コードの複雑さは膨大です!

正式には、マネージ/アンマネージドが.NETスタック上でコードを実行する方法になる可能性があります。しかし、もしあなたがC++のバックグラウンドから来ているのであれば、これはあなたにもう少し関連してくれることを願っています。同様の静脈で

2

、.NETは、言語やフレームワークであり、そして「フレームワーク」は、ここで正確に何を意味するのでしょうか? < <

.NETは、Microsoftの現在のエンタープライズ・ソフトウェア・プラットフォームです。実行するための単一の汎用言語とランタイム•

o The .NET Framework Class Library (FCL). 
o The FCL provides a rich set of high-level functionality for developers. 

:Windowsの機能にアクセスするための単一の汎用インタフェース•

:それは構成されています。NETアプリケーション:.NETアプリケーションを開発するための複数の言語の選択•

o Common Language Runtime (CLR) executes Common Intermediate Language (CIL). 
o The CLR is God: it runs, controls, and polices everything. 

o Every development language is compiled to CIL, which is run by the CLR. 
o C# and VB are the two main development languages. 
10

私はあなたが.NETが何であるかについて混乱している中に一人でいるとは思いません。あなたがカバーするはずのもう一つの答えがありますが、私は他の人のためにこの情報を捨てます。 \ WINDOWS \ Microsoft.Net \ Frameworkのに

をそこにあなたがインストールされているバージョン(複数可)にspecficされたフォルダが表示されます:.NETは「本当に」単にCに移動されたかを確認する

。たとえば、それがインストールされている場合は、v2.0.xxxxxフォルダに移動します。

このフォルダには、フレームワークがあります。基本的には、.exeファイルと.dllファイルの束が表示されます。 System。*。dllで始まるすべてのDLLファイルは、基本的に.Netフレームワークです。

このフォルダに表示される.exeファイルは、開発者用およびコンパイラ用のユーティリティです。あなたはC#について言及しました。 csc.exeファイルを探します。それはあなたのC#コンパイラです。

プログラムを作成することは本当に簡単です。 hello.csファイルに次のコードを投げます。

using System; 
class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("hello world"); 
     } 
    } 

次にコマンドラインタイプの> CSC hello.csあなたに.exeファイルを生成します

。それを実行すると、明らかに「こんにちはの世界」が吐き出されます。

Console.WriteLine()と呼ばれる行がフレームワークを呼び出しています。コンソールは、System名前空間内に存在するオブジェクトであり、WriteLine()は静的メソッドです。

これは、そのConsole.WriteLineを()メソッドの逆アセンブルコードです:「?私はPHPや.NETを使用すべき」人々は、のようなものが言う、あるいは「私はPythonやを使用すべき

[HostProtection(SecurityAction.LinkDemand, UI=true)] 
public static void WriteLine(string value) 
{ 
    Out.WriteLine(value); 
} 

。あなたが議論している間違ったことがどうなっているか見始める。彼らは明らかに言語をフレームワークと比較しています。 C#は言語であり、.Netプラットフォームの上にコードを書くために使用できる多くの言語の1つに過ぎません。 Console.WriteLine()の同じメソッドは、C#、VB.Net、Pascal、C++、Ruby、Python、F#および.Netプラットフォームの上で動作するようにされた他の言語から呼び出すことができます。

私は役立つことを願っています。個人的に

0

-Keith

、私は言葉「フレームワーク」は誤った名称のビットだと思います。

.NETは、実行環境(CLR仮想マシン)と一連のライブラリで構成された「プラットフォーム」です。これは、JavaやPerlやPython(まったく「フレームワーク」と呼ばれることはありません)とまったく似ています。

ほとんどの場合、「フレームワーク」という言葉は、ライブラリのようにプラットフォームの上に座る(つまり、独自の実行環境を持たない)SpringやStruts、QTなどのプロジェクトで使用されます。

しかし、「ライブラリ」とは異なり、フレームワークは基本となるプラットフォームの基本的な操作を再定義しようとしています。(Springの依存関係注入は普通のJavaコードのコンストラクタ呼び出しロジックを無視しています。QTのシグナルとスロットの実装は普通のC++コードに反しています)。

私はちょうど賢い奴隷ですが、フレームワークではありません。それはプラットフォームです。

-1

管理コード - MSILとILとマネージコードは同じです。アプリケーションをビルドすると、.dllファイルまたは.exeファイルがBinフォルダに生成されます。これらのファイルはManaged codeと呼ばれます。 OSによって理解されるネイティブコードを生成するCLR。

+0

これは既に他の回答でカバーされています。あなたの投稿が付加価値のある広告を提供する場合にのみ追加してください。 – Raju

関連する問題