2.IL 代码语句就像汇编语言指令,它们被.NET 的虚拟机也就是 CLR执行。在运行时,CLR 从程序集中加载 IL 代码,然后 JIT 编译器编译成 Native Code,最后交由 CPU执行。
在 Developer Command Prompt 输入 ildasm HelloWorldApp.exe,你会看到ILDASM 工具加载编译过后的程序集:
双击 MANIFEST 节点,查看元数据:
可以看到.NET Metadata 的版本是 4.0.30319,并且依赖外部的程序集mscorlib,它的版本是4.0.0.0,上述截图告诉我们,要运行这个应用程序需要安装.NET Framework 4.0以上。
关闭 MANIFEST 窗口,再展开 Program 节点,双击 Main 方法:
注意IL 指令:ldstr(load string ),nop(no operation ),call,ret(return)。记住IL 最终被 CLR 执行。
使用 .NET Core CLI 编译应用程序
要使用最新的.NET Core Command Line(CLI),请确保安装了.NET Core 和 CLI Tools。你可以访问 https://dotnet.github.io/ 来为 Windows、Linux、OS X 安装它们。
成功安装.NET Core CLI Tools 之后,可以在 Developer Command Prompt 键入 dotnet help 来 查看具体使用:
使用 CLI 创建.NET Core 应用程序
你需要通过 Developer Command Prompt 使用如下命令:
1.再次进入 C:\Code 文件夹 cd c:\code
2.创建新文件夹 mkdir SecondApp
3.进入新文件夹 cd SecondApp
4.使用 CLI 创建.NET Core应用程序 dotnet new
5.查看目录结构 dir
dotnet new 命令创建了一个新的.NET Core 应用程序,包含两个文件,分别是 Program.cs 和 project.json。
Program.cs 是个简单的控制台应用程序,输出“Hello World”
using System; namespace ConsoleApplication { public class Program { public static void Main(string[] args) { Console.WriteLine("Hello World!"); } } }
而另一个文件:project.json,它是项目配置文件,并以JSON的格式定义了应用程序的基本信息,比如:version、buildOptions、authors、dependencies、frameworks 等。
{ "version": "1.0.0-*", "buildOptions": { "emitEntryPoint": true }, "dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.0.0-rc2-3002702" } }, "frameworks": { "netcoreapp1.0": { "imports": "dnxcore50" } } }
上述JSON 格式中,由于 Main 方法作为应用程序的入口(Entry Point),所以需要将 buildOptions 节点下的emitEntryPoint 属性设置为 true。
dependencies 节点代表应用依赖的 packages,默认情况下只添加了 Microsoft.NETCore.App 的依赖。值得注意的是,Microsoft.NETCore.App 是一个引用类型的Nuget Package,它又引用了其他的Nuget Package。这样的好处是避免添加大量的其他package。
frameworks 节点列出了应用程序支持的 frameworks。默认情况下,应用程序只支持.NET Core 1.0,以别名 netcoreapp1.0 表示。netcoreapp1.0 下的 imports 节点 引用旧名称 dnxcore50。这允许我们仍旧可以使用旧名称的 package。
接着,通过dotnet restore 下载所需要的依赖项
通过 project.lock.json,查看具体下载的 package 版本。
为了编译应用程序,使用命令 dotnet build。
最后,使用 dotnet run 运行应用程序。
值得注意的是,在 framework 中也可以添加应用程序对其他 frameworks 的支持,添加字符串net46,表示当前的控制台应用程序构建于.NET Framework 4.6之上:
"frameworks": { "netcoreapp1.0": { "imports": "dnxcore50" }, "net46":{} }
遗憾的是,dotnet build 之后,发生了异常。如下所示(注:当前版本是.NET Core RC 2),
可以看到异常信息是 System.Runtime.Loader 不支持.NET Framework 4.6。只是一个很笼统的信息,个人猜测 Runtime Loader 只支持 CoreCLR 的加载,在 Github(https://github.com/dotnet/corefx/issues/8453) 中,也应证了我的观点。暂时的解决方法是将dependencies 节点 移入到frameworks 下的 netcoreapp1.0 中:
{ "version": "1.0.0-*", "buildOptions": { "emitEntryPoint": true }, "frameworks": { "netcoreapp1.0": { "imports": "dnxcore50", "dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.0.0-rc2-3002702" } } }, "net46":{} } }