質問

私は 20 年近く C / C++ コードを書いてきました。Perl、Python、PHP、および Java の知識もあり、JavaScript も独学で勉強しています。しかし、私は .NET、VB、または C# についてはまったくやったことがありません。正確に何をするのか 管理された コードって意味?

ウィキペディア それを説明します 単純に

仮想マシンの管理下で実行されるコード

そして、Java は (通常は) マネージ コードであると具体的に述べています。

  • この用語が C# / .NET にのみ適用されるように見えるのはなぜですか?
  • C# を VM も含む .exe にコンパイルすることはできますか、それともそれをパッケージ化して別の .exe (Java のように) に渡す必要がありますか?

同じような調子で、

  • .NET ですか 言語 または フレームワーク, 、ここでの「フレームワーク」とは一体何を意味するのでしょうか?

OK、それは複数の質問ですが、私と同じくらい長くこの業界にいる者としては、今はかなり N00B っぽい気分です...

役に立ちましたか?

解決

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

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

https://bitbucket.org/brianritchie/wiki/wiki/.NET%20言語

上記のページには、.NET バージョンがある言語のリストと、そのページへのリンクが含まれています。

他のヒント

これは主に、すべてのメモリ割り当てが「管理」されているという事実を指します。マネージド コードを使用している場合は、オブジェクトの使用が終了したときにオブジェクトを解放することを心配する必要はありません。単純にスコープ外に出すことを許可すると、VM は最終的にそれらへの参照がなくなったことを認識し、ガベージ コレクションを実行してメモリをシステムに返します。

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

.Net とは何かについて混乱しているのはあなただけではないと思います。あなたがカバーすべき他の回答がすでにありますが、他の人のためにこのちょっとした情報を提供します。

.Net が「本当に」何であるかを確認するには、c:\Windows\Microsoft.Net\Framework にアクセスしてください。

そこには、インストールしたバージョンに固有のフォルダーが表示されます。たとえば、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 ファイルが生成されます。実行すると、明らかに「hello world」が吐き出されます。

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

これは、その Console.WriteLine() メソッドの逆アセンブルされたコードです。

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

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

それが役立つことを願っています。

-キース

これは主に .NET を説明するために使用されます。これは、Microsoft が .NET を C/C++ やその他の古い言語と区別するために選択した用語だからです。Microsoft がこの名前を選んだのは、C#/.NET と Java の類似点を強調したくなかったため (これを「仮想マシン コード」などと呼ぶと「仮想マシン コード」になるのではなく)、通常 Java に関連付けられる用語ではなかったからです。かなり Java っぽく聞こえます)。基本的に、「マネージ コード」の使用は、技術主導ではなく、マーケティング主導の用語です。

特に .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; }
}

審判に気づきましたか?これはほぼマネージド クラスを指定します。ただし、2 種類のコードを混在させると非常に混乱します。たとえば、参照ポインター (^) ポインターと同等のマネージドをアンマネージ クラス内のピクチャ ボックス コントロールに保存するとします。ガベージ コレクターはメモリを移動できるため、次回ピクチャー ボックスを逆参照しようとしても、そのボックスが見つかりません。ランタイムは、メモリの変更についてアンマネージ コードに通知しません。

したがって、アンマネージ コードがそれを追跡できるように、マネージド オブジェクトをメモリ内に固定する必要があります。さらに、開梱や、この 2 つを組み合わせることができるその他のあらゆる種類の特殊な機能もあります。コードの複雑さは膨大です。

公式には、マネージド/アンマネージドは、.NET スタック上でのコードの実行方法に帰着する可能性があります。ただし、C++ のバックグラウンドを持っている場合は、これがもう少し意味のあるものになることを願っています。

マネージドとは、コードがネイティブ コードにコンパイルされず、仮想マシンの支援下で実行されることを意味します。Java はバイトコードと呼ばれる中間形式にコンパイルされ、Java VM はそれを解釈して実行する方法を認識します。すべての .NET 言語は同様の処理を行い、.NET ランタイムが解釈する IL (中間言語) にコンパイルします。.NET IL には .dll と .exe ファイルの末尾があるため、少し混乱します。

用語 管理された Microsoft がこの用語を使用しているため、通常は .NET にのみ適用されます。Microsoft では通常、.NET 管理実行環境に関して「仮想マシン」という用語を使用しません。

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

「.NET Framework」は基本的に、Microsoft が提供する巨大なライブラリのセットであり、アプリケーションの開発に使用できる数千のクラスが含まれています。

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

気分を害する人もいるかもしれませんが、コンパイル済みではなくアンマネージドという言葉を使うためにマネージドという言葉が使われたのではないかと思います。マネージドにはそれ以上の意味があるかもしれませんが、実際には、ほぼジャストインタイムでコンパイルされるもの (一度解釈されたコードや pcode の代わりとして) とネイティブでコンパイルされたコードを区別するために使用されるようです。

または、別の言い方をすると、どちらを使用したいですか:

a) システムに対して制御不能なことを行う可能性があるアンマネージ コード。

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

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

同様に、.NET は言語ですか、それともフレームワークですか。ここでの「フレームワーク」とは正確には何を意味しますか?<<

.NET は、Microsoft の現在のエンタープライズ ソフトウェア プラットフォームです。内容は以下のとおりです。

• Windows 機能にアクセスするための単一のユニバーサル インターフェイス:

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

• .NET アプリケーションを実行するための単一のユニバーサル言語とランタイム:

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

• .NET アプリケーション開発のための複数の言語の選択:

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

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

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

.NET はフレームワークです。多くの言語 (VB.NET、C#、IronPython、boo など) から使用できます。

.NET は常に解釈どおりに実行されます。いいえ、.exe 内に「VM」を含めることはできません。.NET アプリを実行したいユーザーは、フレームワークをインストールする必要があります。

CPU によって直接実行されるのではなく、仮想マシンによって実行されるコードを参照できます。

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

個人的には、「フレームワーク」という言葉は少し間違っていると思います。

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

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

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

私がただの衒学的野郎であることは承知していますが、私にとって .NET はフレームワークではありません。それはプラットフォームです。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top