不用IDE写C#的Hello World的方法

 更新时间:2021年09月09日 14:55:56   投稿:lijiao  
这篇文章主要介绍了不用IDE写C#的Hello World的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

用Visual Studio等IDE写C#的Hello World非常简单,但脱离了IDE你能不能打印出Hello World呢?这不是说工作时脱离IDE,而是学习一下CLR的执行模型.

Hello World

新建一个记事本,输入如下代码,另存为HelloWorld.txt.

using System;  
namespaceHelloWorld  
{  
  classProgram  
  {  
    static voidMain(string[] args) {  
      Console.WriteLine("Hello World!");  
      Console.ReadKey();  
    }  
  }  
} 

打开Visual Studio 2008(2005,2010) 命令提示程序

却换到HelloWorld.txt的目录

运行命令:csc /out:Hello.exe HelloWorld.txt

如无意外,将会编译出Hello.exe,能打印出Hello World.

CLR执行模型-编译期

CLR程序的执行过程大致分为两步,编译期和运行期,编译期过程大致如下图:

其中编译期逻辑上也可分为两步:

CLR(C#)编译器接受源代码文件,并编译为托管模块.托管模块包括IL代码,元数据,CLR头等组成部分.上面的例子中就是将HelloWorld.txt编译成托管模块.

一般程序集都会包含很多源代码文件(这里只有HelloWorld.txt)和资源文件,第二步就是把各个源代码文件和资源文件对应编译结果合并成程序集.

执行上面两步就可以得到一个XX.dll或XX.exe的程序集.就像上面的Hello.exe.

编译器如何知道要编译成托管模块还是资源文件?其实是必须明确告诉编译器每个文件的怎么编译,这个对应Visual Studio的文件属性的生成操作.

右击任何Visual Studio解决资源方案的文件-->属性-->生成操作:

指定Class1为嵌入的资源,用ILSpy查看会发现只是把Class1嵌入到程序集中,名称为:命名空间.文件名:

你甚至可以将一张图片设为编译让编译器试图去编译它,不过会报错.

运行期

上面生成了程序集,程序集内的是IL代码,它还不是可运行的代码.IL是与CPU无关的机器语言.直到程序集被调用,才会由JIT(Just-in-Time,实时)编译器编译为本机代码(CPU指令).在运行时,CLR执行如下步骤:

◆ 检查程序集的安全特性;

◆ 在内存中分配空间;

◆ 把程序集中的可执行代码发送给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.css(博客园不支持txt格式):

再次运行命令:csc /out:Hello.exe HelloWorld.txt,得到Hello.exe,执行时发现有一定的延迟才会打印出Hello World.

生成本机代码

使用.NET提供的NGen.exe,可以将IL代码编译成本机代码.可以解决上面的问题.NGen.exe有两个作用:

加快应用程序的启动速度.因为代码已编译为本机代码,运行时不需要再花时间编译

减少应用程序的程序集.如果一个程序集会同时加载多个进程.NGen.exe会将IL编译成本机代码,并保存到一个单独的文件中.这样就可以通过"内存映射"的方式,同时映射到多个进程中,使代码共享.避免每个进程一份代码.

再次运行Visual Studio 2008(2005,2010) 命令提示程序

运行如下命令:ngen install Hello.exe:

命令完成(在我的机器大概要10秒左右,到能再次输入命令才完成)后运行Hello.exe会发现马上就能打印出Hello World,没有任何延迟.

对于ASP.NET,Microsoft另外提供了aspnet_compiler.exe,我们可以在ASP.NET程序建一个脚本(.bat)预编译程序.以下是一个示例(from老赵的程序):

%SYSTEMROOT%\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler -v / -p .\MyMvcDemo.Web.UI -f -errorstack .\Compliled
PAUSE

关于aspnet_compiler.exe不多介绍,感兴趣的可以自己搜索相关资料.

相关文章

  • C#中间语言及ILDASM工具用法

    C#中间语言及ILDASM工具用法

    这篇文章介绍了C#中间语言及ILDASM工具用法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01
  • C# / VB.NET 在PPT中创建、编辑PPT SmartArt图形的方法详解

    C# / VB.NET 在PPT中创建、编辑PPT SmartArt图形的方法详解

    本文介绍通过C#和VB.NET程序代码来创建和编辑PPT文档中的SmartArt图形。文中将分两个操作示例来演示创建和编辑结果,需要的朋友可以参考下
    2020-10-10
  • 解析C#中@符号的几种使用方法详解

    解析C#中@符号的几种使用方法详解

    本篇文章是对C#中@符号的几种使用方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C#基础语法:可空类型详解

    C#基础语法:可空类型详解

    这篇文章主要介绍了C#基础语法:可空类型详解,本文分析了可空类型的源码、研究了可空类型强制转换为常规类型、可空类型的运算等内容,需要的朋友可以参考下
    2015-06-06
  • C#实现简易多人聊天室

    C#实现简易多人聊天室

    这篇文章主要为大家详细介绍了C#实现简易多人聊天室,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C# 图片与二进制转换的简单实例

    C# 图片与二进制转换的简单实例

    这篇文章介绍了C# 图片与二进制转换的简单实例,有需要的朋友可以参考一下
    2013-09-09
  • C#如何修改项目名图文详解

    C#如何修改项目名图文详解

    最近开发工作接近尾声,客户来要求更换项目的名称,差不多要变更整个解决方案中项目名称,引用等等,这个工作量还是很大的,这篇文章主要给大家介绍了关于C#如何修改项目名的相关资料,需要的朋友可以参考下
    2023-01-01
  • C#实现协同过滤算法的实例代码

    C#实现协同过滤算法的实例代码

    这篇文章介绍了C#实现协同过滤算法的实例代码,有需要的朋友可以参考一下
    2013-07-07
  • C#中Linq延迟查询的例子

    C#中Linq延迟查询的例子

    这篇文章主要介绍了C#中Linq延迟查询的例子,本文用一个实例来讲解延迟查询的使用,需要的朋友可以参考下
    2015-06-06
  • C#中的那些常用加密算法

    C#中的那些常用加密算法

    本文主要讲解一下C#常用的那些加密算法,包括MD5加密、SHA1加密、Base64加密、Des加密、RSA加密等,需要的朋友可以参考下
    2020-11-11

最新评论