前言
我们一般在 Visual Studio 集成环境中使用 C# 语言,VS 是一个非常非常强大的开发环境,简约而不简单,高效、优雅的操作令人窒息。
VS 的这些特点使得 VS 学习曲线平缓,官方指导文档全而不繁,简洁精准,对待新手跟玩家充钱了一样友好。
在 VS 中编程,写好代码后,点击可爱的小三角,或者按 F5 ,就可以立刻看到程序运行结果。
作为基础知识,我们有必要关心一下 C# 代码是如何被开发环境编译并且运行的。
C# 编译过程
第一步,包含 C# 代码的 cs 文件由 csc.exe 编译成 MSIL ( Microsoft Intermediate Language ,微软中间语言 ),文件后缀是 exe 或者 dll,也被称为程序集。这是伪代码,该伪代码独立于任何CPU,只要装有 .Net FrameWork 和相应编译器的机器,就可以将伪代码进一步编译成机器码,这样就使得 C# 变得可移植。
csc.exe 存在于 C:\Windows\Microsoft.NET\Framework\v4.0.30319\ 下(不同 .NET 版本位置不同)。
点击可爱的小三角,VS 就帮我们做了这一步,但是绝知此事要躬行,一会儿在下面我们可以手动进行编译,感受一下。
第二步,当 exe 文件被启动,伪代码被 CLR(Commom Language RunTime,公共语言运行库)捕获,CLR 激活内部的 JIT (Just in time,即时编译)编译器,将伪代码编译成特定 CPU 的机器语言。
有一个问题,如果每次程序启动,都需要 JIT 编译,那岂不是效率比较低。实际上, JIT 编译完伪代码后,会把汇编结果存储在 GAC(Global Assembly Cache,全局程序集缓存)中,这样下次就不需要再进行编译,执行效率相当高。
GAC 是计算机范围内的代码缓存,它存储专门安装的程序集,这些程序集由计算机上的许多应用程序共享。在全局程序集缓存中部署的应用程序必须具有强名称。
.Net 提供的命令行工具 gacutil.exe 用于支持这一功能。gacutil.exe 可以将具有强名称的程序集添至全局程序集缓存。
GAC 位置一般在系统盘下 Windows/Assembly 目录下,如 C:\Windows\assembly\。
手动编译
1,用 TXT 文档写源代码,文件名随意设定,这里设定为 “Compile_Test” ,然后把后缀改成 “cs”,文件放置到 D 盘根目录(放哪里都行)。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Console.WriteLine("Compile accomplish!"); Console.ReadKey(); } } }
2,打开 CMD ,把路径定位到 csc.exe 目录下,或者直接在环境变量中添加该路径。
3,输入 csc /out:D:/Test.exe D:/Compile_Test.cs
。回车,即可把位于 D 盘根目录的 Compile_Test.cs 文件编译成 exe 程序集,并且输出到 D 盘根目录。如下图所示:
如果出现 “error CS1567: 生成 Win32 资源时出错: 拒绝访问” 错误,请检查路径和 CMD 权限,要以管理员身份运行。
4,打开 D 盘,就可以看到名为 “Test.exe” 的可执行文件躺在里面,双击其运行,即可看到运行结果:
5,更多关于 csc.exe 的使用规则,可以访问微软官方文档:https://technet.microsoft.com/zh-cn/library/78f4aasd(v=vs.120)