ホームページ  >  記事  >  バックエンド開発  >  IDEなしでも書けるC#のHello Worldを詳しく解説(写真)

IDEなしでも書けるC#のHello Worldを詳しく解説(写真)

黄舟
黄舟オリジナル
2017-03-10 11:24:401420ブラウズ

Visual Studio などの IDE を使用して C# で Hello World を書くのは非常に簡単ですが、IDE なしで Hello World を出力できますか? これは IDE なしで作業するという意味ではなく、CLR の実行モデルを学ぶことを意味します。 ハローワールド

1. 新しいメモ帳を作成し、次のコードを入力して、HelloWorld.txt として保存します。

りー

2. Visual Studio 2008 (2005、2010) コマンド プロンプト プログラムを開きます

IDEなしでも書けるC#のHello Worldを詳しく解説(写真) 3. HelloWorld.txt

のディレクトリに切り替えます

IDEなしでも書けるC#のHello Worldを詳しく解説(写真) 4. コマンドを実行します: csc /out:Hello.exe HelloWorld.txt

IDEなしでも書けるC#のHello Worldを詳しく解説(写真) 予期せぬことが起こらなければ、Hello.exe がコンパイルされ、Hello World が出力されます。

CLR 実行モデル - コンパイル時間

CLR プログラムの実行プロセスは、コンパイル期間とランタイムの 2 つのステップに大別されます。コンパイル期間のプロセスは、次のようになります。

コンパイル期間は論理的に 2 つのステップに分けることもできます:

IDEなしでも書けるC#のHello Worldを詳しく解説(写真) 1. CLR (C#) コンパイラーはソース コード ファイルを受け取り、それらをマネージド モジュールにコンパイルします。マネージド モジュールには、IL コード、メタデータ、CLR ヘッダー、その他のコンポーネントが含まれます。上記の例では、HelloWorld.txt がマネージド モジュールにコンパイルされます。

2. 一般に、アセンブリには多数のソース コード ファイル (ここでは HelloWorld.txt のみ) とリソース ファイルが含まれます。2 番目の手順では、各ソース コード ファイルとリソース ファイルの対応するコンパイル結果をアセンブリにマージします。

上記の 2 つの手順を実行して、上記の Hello.exe と同様の XX.dll または XX.exe アセンブリを取得します。

コンパイラは、マネージド モジュールにコンパイルするかリソース ファイルにコンパイルするかをどのように判断するのでしょうか? 実際、コンパイラは、各ファイルをコンパイルする方法を明示的に指示する必要があります。これは、Visual Studio のファイル属性の生成操作に相当します。 任意の Visual Studio ソリューション リソース ファイルを右クリック --> プロパティ --> ビルド操作:

Class1 を埋め込みリソースとして指定します。ILSpy で確認すると、Class1 は名前空間:

という名前でアセンブリにのみ埋め込まれていることがわかります。

IDEなしでも書けるC#のHello Worldを詳しく解説(写真)

イメージをコンパイルするように設定し、コンパイラーにコンパイルを試行させることもできますが、エラーが報告されます。

開催期間

IDEなしでも書けるC#のHello Worldを詳しく解説(写真) アセンブリは上記で生成されていますが、このアセンブリにはまだ実行可能なコードではない IL コードが含まれています。 IL は、アセンブリが呼び出されるまで、JIT (ジャストインタイム) コンパイラーによってネイティブ コード (CPU 命令) にコンパイルされる、CPU に依存しない機械語です。実行時に、CLR は次の手順を実行します:

1. アセンブリのセキュリティ機能を確認します。

2. メモリ内にスペースを割り当てます;

3. アセンブリ内の実行可能コードを JIT コンパイラに送信し、その一部をネイティブ コード (CPU 命令) にコンパイルします。

アセンブリの実行可能コードは、必要に応じて JIT コンパイラによってコンパイルされ、ネイティブ コード (CPU 命令) はプログラム内で後で実行できるようにキャッシュされます。アプリケーションが終了すると、コンパイルされたネイティブ コードも破棄されます。

たとえば、上記のコードを次のように変更すると、

using System;
namespace HelloWorld
{
   class Program
   {
        static void Main(string[] args) {
            Console.WriteLine("Hello World!");
            Console.ReadKey();
        }
    }
}

最初の WriteLine は、最初に JIT コンパイルしてから実行する必要があります。 WriteLine コードはコンパイルされているため、2 番目の WriteLine は JIT コンパイルをスキップして、メモリ ブロック内のコードを直接実行します。

メモリ割り当てや JIT コンパイル プロセスなどにより、プログラムを初めて実行するときにパフォーマンスが低下します。この傾向は、ASP.NET を作成するときに特に顕著で、F5 キーを押してから実行するまでに時間がかかります。ホームページが表示されます。

このプロセスをシミュレーションして体験してみましょう。多数のクラスを使用してメモリ割り当て時間を延長します。このファイル HelloWorld.cs を参照してください:

コマンドを再度実行します: csc /out:Hello.exe HelloWorld.txt を使用して Hello.exe を取得します。実行中に、Hello World が出力されるまでに一定の遅延があることがわかります。

ネイティブコードを生成する

IDEなしでも書けるC#のHello Worldを詳しく解説(写真) .NET が提供する NGen.exe を使用すると、IL コードをネイティブ コードにコンパイルでき、上記の問題を解決できます。 NGen.exe には 2 つの機能があります:

1. アプリケーションの起動速度を高速化します。コードはネイティブ コードにコンパイルされるため、実行時のコンパイルに時間がかかりません。

2. アプリケーションのアセンブリを削減します。アセンブリが複数のプロセスによって同時に読み込まれる場合、NGen.exe は IL をネイティブ コードにコンパイルし、別のファイルに保存します。このように、「メモリ マッピング」を通じて同時に複数のプロセスにマッピングしてコードを共有し、各プロセスがコードのコピーを持つことを回避できます。

Visual Studio 2008 (2005、2010) コマンド プロンプトを再度実行します

次のコマンドを実行します: ngen install Hello.exe:

IDEなしでも書けるC#のHello Worldを詳しく解説(写真)

コマンドが完了したら (私のマシンでは約 10 秒かかります。コマンドを再度入力できるようになるまでコマンドは完了しません)、Hello.exe を実行すると、Hello World が遅延なくすぐに印刷できることがわかります。

以上がIDEなしでも書けるC#のHello Worldを詳しく解説(写真)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。