57

私はC/C ++コードを20年近く書いていますが、Perl、Python、PHP、およびいくつかのJavaも知っており、JavaScriptを自分で学んでいます。しかし、私は.NET、VB、またはC#の作業を行ったことがありません。マネージコードとは正確にはどういう意味ですか?

ウィキペディアはそれを単に次のように説明しています

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

具体的には、Javaは(通常は)マネージコードであると書かれているので、

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

同じような調子で、

  • .NETは言語またはフレームワークであり、ここで「フレームワーク」とは正確にはどういう意味ですか?

わかりました。それは複数の質問ですが、私がいる限り業界に携わっている人にとっては、今はかなりN00Bっぽい感じがします...

4

15 に答える 15

38

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

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

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

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

于 2008-09-11T23:47:32.517 に答える
13

.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ファイルが生成されます。それを実行すると、明らかに「helloworld」が吐き出されます。

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プラットフォーム上で動作するように作成されたその他の言語から呼び出すことができます。

それがお役に立てば幸いです。

-キース

于 2008-09-20T13:45:18.263 に答える
11

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

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

于 2008-09-11T23:46:41.757 に答える
10

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

于 2008-09-11T23:44:17.660 に答える
6

特に.NETとVisualC++では、アンマネージコードとマネージコードの両方を使用できます。これらの用語は、メモリが割り当てられ、「管理される」方法を指します。

アンマネージコードは、あなたが慣れている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種類のコードを組み合わせると、非常に混乱します。たとえば、参照ポインター(^)ポインターに相当するマネージドポインターを、アンマネージドクラス内のPictureBoxコントロールに保存するとします。ガベージコレクターはメモリを移動できるため、次にピクチャーボックスを逆参照しようとしても、ガベージコレクターが見つかりません。ランタイムは、アンマネージコードにメモリの変更を通知しません。

したがって、管理対象オブジェクトをメモリに固定して、管理対象外のコードが追跡できるようにする必要があります。次に、開梱と、2つを混ぜ合わせることができる他のあらゆる種類の癖があります。コードの複雑さは非常に大きいです!

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

于 2008-09-20T13:22:42.327 に答える
3

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

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

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

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

于 2008-09-11T23:43:33.370 に答える
3

一部の人を怒らせる危険を冒して、コンパイルされた代わりに管理されていないという言葉を使用できるように、管理されたという言葉が使用されたのではないかと思います。マネージはもっと意味があるかもしれませんが、現実には、ほとんどジャスト イン タイム コンパイル (一度解釈されたものまたは pcode の代わりとして) とネイティブ コンパイル コードを区別するために使用されているようです。

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

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

b) 高速で安定した、OS に近いネイティブ コンパイル コード。

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

于 2008-09-12T04:20:28.323 に答える
3

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

于 2008-09-11T23:45:51.430 に答える
2

同様に、.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.
于 2008-09-20T13:43:09.140 に答える
1

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

于 2008-09-11T23:44:19.750 に答える
1

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

于 2008-09-11T23:45:48.653 に答える
0

個人的には、「フレームワーク」という言葉は少し誤称だと思います。

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

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

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

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

于 2008-10-08T19:04:44.973 に答える
0

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

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

于 2008-09-11T23:42:37.460 に答える
0

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

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

于 2008-09-11T23:48:20.597 に答える