不用IDE也能写出C#的Hello World详解(图)
用Visual Studio等IDE写C#的Hello World非常简单,但脱离了IDE你能不能打印出Hello World呢?这不是说工作时脱离IDE,而是学习一下CLR的执行模型.
Hello World
1、新建一个记事本,输入如下代码,另存为HelloWorld.txt。
using System; namespace HelloWorld { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); Console.ReadKey(); } } }
2、打开Visual Studio 2008(2005,2010) 命令提示程序
3、切换到HelloWorld.txt的目录
4、运行命令:csc /out:Hello.exe HelloWorld.txt
如无意外,将会编译出Hello.exe,能打印出Hello World。
CLR执行模型-编译期
CLR程序的执行过程大致分为两步,编译期和运行期,编译期过程大致如下图:
其中编译期逻辑上也可分为两步:
1、CLR(C#)编译器接受源代码文件,并编译为托管模块。托管模块包括IL代码、元数据、CLR头等组成部分。上面的例子中就是将HelloWorld.txt编译成托管模块。
2、一般程序集都会包含很多源代码文件(这里只有HelloWorld.txt)和资源文件,第二步就是把各个源代码文件和资源文件对应编译结果合并成程序集。
执行上面两步就可以得到一个XX.dll或XX.exe的程序集,就像上面的Hello.exe。
编译器如何知道要编译成托管模块还是资源文件?其实是必须明确告诉编译器每个文件的怎么编译,这个对应Visual Studio的文件属性的生成操作.
右击任何Visual Studio解决资源方案的文件-->属性-->生成操作:
指定Class1为嵌入的资源,用ILSpy查看会发现只是把Class1嵌入到程序集中,名称为:命名空间.文件名:
你甚至可以将一张图片设为编译让编译器试图去编译它,不过会报错。
运行期
上面生成了程序集,程序集内的是IL代码,它还不是可运行的代码。IL是与CPU无关的机器语言,直到程序集被调用,才会由JIT(Just-in-Time,实时)编译器编译为本机代码(CPU指令)。在运行时,CLR执行如下步骤:
1、检查程序集的安全特性;
2、在内存中分配空间;
3、把程序集中的可执行代码发送给JIT编译器,把其中一部分编译成本机代码(CPU指令)。
程序集的可执行代码在需要的时候由JIT编译器编译,然后本机代码(CPU指令)就被缓存以备后来的程序中执行。一旦应用程序终止,编译好的本机代码也会被丢弃。
例如如果将上面的代码改为:
static void Main(string[] args) { Console.WriteLine("Hello"); Console.WriteLine("World!"); Console.ReadKey(); }
第一个WriteLine需要先JIT编译,再执行。而由于已编译WriteLine的代码,所以第二个WriteLine会直接执行内存块中的代码,跳过JIT编译。
由于分配内存、JIT编译过程等,所以程序会在第一次运行时造成一些性能损失,写ASP.NET时这种感觉特变明显,按了F5会等很久才会显示首页。
下面模拟感受这个过程。用一大堆类延长内存分配的时间,参考这个文件HelloWorld.cs:
再次运行命令:csc /out:Hello.exe HelloWorld.txt,得到Hello.exe,执行时发现有一定的延迟才会打印出Hello World。
生成本机代码
使用.NET提供的NGen.exe,可以将IL代码编译成本机代码,可以解决上面的问题。NGen.exe有两个作用:
1、加快应用程序的启动速度。因为代码已编译为本机代码,运行时不需要再花时间编译。
2、减少应用程序的程序集。如果一个程序集会同时加载多个进程,NGen.exe会将IL编译成本机代码,并保存到一个单独的文件中。这样就可以通过"内存映射"的方式,同时映射到多个进程中,使代码共享,避免每个进程一份代码。
再次运行 Visual Studio 2008(2005,2010) 命令提示程序
运行如下命令:ngen install Hello.exe:
命令完成(在我的机器大概要10秒左右,到能再次输入命令才完成)后,运行Hello.exe会发现马上就能打印出Hello World,没有任何延迟。
Atas ialah kandungan terperinci 不用IDE也能写出C#的Hello World详解(图). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Panduan untuk Active Directory dengan C#. Di sini kita membincangkan pengenalan dan cara Active Directory berfungsi dalam C# bersama-sama dengan sintaks dan contoh.

Panduan kepada Pengubahsuai Akses dalam C#. Kami telah membincangkan Pengenalan Jenis Pengubahsuai Akses dalam C# bersama-sama dengan contoh dan output.

Panduan untuk Penjana Nombor Rawak dalam C#. Di sini kita membincangkan cara Penjana Nombor Rawak berfungsi, konsep nombor pseudo-rawak dan selamat.

Panduan untuk Paparan Grid Data C#. Di sini kita membincangkan contoh cara paparan grid data boleh dimuatkan dan dieksport daripada pangkalan data SQL atau fail excel.

Panduan untuk C# StringReader. Di sini kita membincangkan gambaran keseluruhan ringkas tentang C# StringReader dan berfungsi bersama-sama dengan Contoh dan Kod yang berbeza.

Panduan kepada Corak dalam C#. Di sini kita membincangkan pengenalan dan 3 jenis Corak teratas dalam C# bersama-sama dengan contoh dan pelaksanaan kodnya.

Panduan untuk Pensirian C#. Di sini kita membincangkan pengenalan, langkah-langkah objek siri C#, kerja, dan contoh masing-masing.

Panduan untuk BinaryWriter dalam C#. Di sini kita membincangkan sintaks dan penjelasan, cara ia berfungsi dengan contoh untuk dilaksanakan dengan kod yang betul.
