C# 编译过程的那些事

前言

我们一般在 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 盘根目录。如下图所示:

20180919082732

如果出现 “error CS1567: 生成 Win32 资源时出错: 拒绝访问” 错误,请检查路径和 CMD 权限,要以管理员身份运行。

4,打开 D 盘,就可以看到名为 “Test.exe” 的可执行文件躺在里面,双击其运行,即可看到运行结果:

20180919081949

5,更多关于 csc.exe  的使用规则,可以访问微软官方文档:https://technet.microsoft.com/zh-cn/library/78f4aasd(v=vs.120) 

发表评论

Powered by WordPress | Theme Revised from Doo

苏ICP备18047621号

Copyright © 2017-2024 追光者博客