用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,没有任何延迟。
以上是不用IDE也能写出C#的Hello World详解(图)的详细内容。更多信息请关注PHP中文网其他相关文章!

C#和.NET提供了强大的功能和高效的开发环境。1)C#是一种现代、面向对象的编程语言,结合了C 的强大和Java的简洁性。2).NET框架是一个用于构建和运行应用程序的平台,支持多种编程语言。3)C#中的类和对象是面向对象编程的核心,类定义数据和行为,对象是类的实例。4).NET的垃圾回收机制自动管理内存,简化开发者的工作。5)C#和.NET提供了强大的文件操作功能,支持同步和异步编程。6)常见错误可以通过调试器、日志记录和异常处理来解决。7)性能优化和最佳实践包括使用StringBuild

.NETFramework是一个跨语言、跨平台的开发平台,提供一致的编程模型和强大的运行时环境。1)它由CLR和FCL组成,CLR管理内存和线程,FCL提供预构建功能。2)使用示例包括读取文件和LINQ查询。3)常见错误涉及未处理异常和内存泄漏,需使用调试工具解决。4)性能优化可通过异步编程和缓存实现,保持代码可读性和可维护性是关键。

C#.NET保持持久吸引力的原因包括其出色的性能、丰富的生态系统、强大的社区支持和跨平台开发能力。1)性能表现优异,适用于企业级应用和游戏开发;2).NET框架提供了广泛的类库和工具,支持多种开发领域;3)拥有活跃的开发者社区和丰富的学习资源;4).NETCore实现了跨平台开发,扩展了应用场景。

C#.NET中的设计模式包括Singleton模式和依赖注入。1.Singleton模式确保类只有一个实例,适用于需要全局访问点的场景,但需注意线程安全和滥用问题。2.依赖注入通过注入依赖提高代码灵活性和可测试性,常用于构造函数注入,但需避免过度使用导致复杂度增加。

C#.NET在现代世界中广泛应用于游戏开发、金融服务、物联网和云计算等领域。1)在游戏开发中,通过Unity引擎使用C#进行编程。2)金融服务领域,C#.NET用于开发高性能的交易系统和数据分析工具。3)物联网和云计算方面,C#.NET通过Azure服务提供支持,开发设备控制逻辑和数据处理。

C#.NET开发者社区提供了丰富的资源和支持,包括:1.微软的官方文档,2.社区论坛如StackOverflow和Reddit,3.GitHub上的开源项目,这些资源帮助开发者从基础学习到高级应用,提升编程技能。

C#.NET的优势包括:1)语言特性,如异步编程简化了开发;2)性能与可靠性,通过JIT编译和垃圾回收机制提升效率;3)跨平台支持,.NETCore扩展了应用场景;4)实际应用广泛,从Web到桌面和游戏开发都有出色表现。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

WebStorm Mac版
好用的JavaScript开发工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Atom编辑器mac版下载
最流行的的开源编辑器