前言

其实AOT预编译,在.Net FrameWorker1.0里面就有了。它叫做Ngen,只不过当时叫做生成本机映像,实际上还是一个东西,也就是预编译。本篇来看下。

概括

1.介绍

现在的现代化的.Net已经到了.Net8了,它的AOT程序已经趋近于完美。可以单个Exe运行在MacOS/Linux/Win等平台上。但是在.Net FrameWorker上面如果想用AOT应该怎么搞呢?

微软很早之前就提供了一个小工具,叫做:Ngen.exe。它跟你安装Visual Studio的时候一起安装进来了。它的路径一般的在:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe //注意这里是64位的

它就是让不跨平台的.Net Frameworker生成本地机器码,然后执行。

2.用法

应该怎么用它呢?

一:代码

假如说你有以下.Net Frameworker代码,项目名称NgenDemo

static void Main(string[] args)
{
Console.WriteLine("hello Ngen Call The Main Method");
Console.ReadLine();
}

二.注意事项:

注意一:把VS里的AnyCpu切换成X64

注意二:打开VS命令行工具,选择64位的

注意三:要以管理员的身份运行64位VS命令行工具

三:生成

比如把以上NgenDemo这个项目放到桌面上。在Visual Studio里面摁F5运行下,在目录:

C:\Users\Administrator\Desktop\NgenDemo\bin\x64\Debug

下面会生成:NgenDemo.exe。

打开VS命令行工具:

x64 Native Tools Command Prompt for VS 2022  //注意这里是64位的

运行如下命令:ngen.exe install后面跟着NgenDemo.exe路径

C:\Windows\System32>ngen.exe install "C:\Users\Administrator\Desktop\NgenDemo\bin\x64\Debug\NgenDemo.exe"
Microsoft (R) CLR Native Image Generator - Version 4.8.9065.0
Copyright (c) Microsoft Corporation. All rights reserved.
1> Compiling assembly C:\Users\Administrator\Desktop\NgenDemo\bin\x64\Debug\NgenDemo.exe (CLR v4.0.30319) ...

查看下生成的映像是否正确:

C:\Windows\System32>ngen.exe display "C:\Users\Administrator\Desktop\NgenDemo\bin\x64\Debug\NgenDemo.exe"
Microsoft (R) CLR Native Image Generator - Version 4.8.9065.0
Copyright (c) Microsoft Corporation. All rights reserved.
NGEN Roots:
C:\Users\Administrator\Desktop\NgenDemo\bin\x64\Debug\NgenDemo.exe
NGEN Roots that depend on "C:\Users\Administrator\Desktop\NgenDemo\bin\x64\Debug\NgenDemo.exe":
C:\Users\Administrator\Desktop\NgenDemo\bin\x64\Debug\NgenDemo.exe
Native Images:
NgenDemo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null <debug>

可以看到映像已经生成了。

到目录:

C:\Windows\assembly\NativeImages_v4.0.30319_64

里面看到一堆文件,它就是生成本机映像,以及本机缓存。此后在本机运行的时候,可以直接双击NgenDemo.exe就可以运行了。

如果想要卸载本机映像,运行如下命令:

C:\Windows\System32>ngen.exe uninstall "C:\Users\Administrator\Desktop\NgenDemo\bin\x64\Debug\NgenDemo.exe"
Microsoft (R) CLR Native Image Generator - Version 4.8.9065.0
Copyright (c) Microsoft Corporation. All rights reserved.
Uninstalling assembly C:\Users\Administrator\Desktop\NgenDemo\bin\x64\Debug\NgenDemo.exe

就可以卸载了。

以上就是.Net Framework生成的本机映像。它有极大的缺陷,每个机器上都要生成一次,其次它的程序集缓存不能合并到一起,需要C:\Windows\assembly路径下的文件支持,才能够运行。

所以后面微软开启了corert项目以及现在的nativeAOT项目,都是意图取代它。

结尾

作者:江湖评谈

欢迎关注我的公众号(jianghupt),有更多精彩技术文章分享

.Net FrameWork下面如何生成AOT呢?的更多相关文章

  1. Entity Framework中查看生成的SQL语句

    Entity Framework 4.0 中是这样的,高版本的跟这个有些差异,不太一样,貌似已经到7了 using (Entities entities = new Entities()) { var ...

  2. EF ( Entity Framework) 操作ArcCataLog 生成的(Sql Server)空间数据库

    因为项目需求,现在需要利用EF 操作由Arccatalog生成的sql server空间数据库..在此之前,一直没有接触过空间数据库,在操作空间数据库时 绕了许多弯... 因此写一篇随笔做一个总结. ...

  3. Entity Framework Core一键生成实体命令

    打开Vs中工具——Nug包管理器——程序包管理控制台 设置启动项目为存储实体模型的类库或控制台 Scaffold-DbContext  "数据库连接字符串" Microsoft.E ...

  4. Django restful framework中自动生成API文档

    自动生成api文档(不管是函数视图还是类视图都能显示) 1.安装rest_framework_swagger库 pip install django-rest-swagger 2.在项目下的 urls ...

  5. 【转】Django restful framework中自动生成API文档

    转自 https://www.cnblogs.com/sui776265233/p/11350434.html 自动生成api文档(不管是函数视图还是类视图都能显示) 1.安装rest_framewo ...

  6. entity framework 查看自动生成的sql

    public MesDbContext() : base("name=mysql") { Database.Log = new Action<string>(msg = ...

  7. Entity Framework Core 使用HiLo生成主键

    #cnblogs_post_body.cnblogs-markdown p img { max-width: 95%; } HiLo是在NHiernate中生成主键的一种方式,不过现在我们可以在Ent ...

  8. 如何利用Framework模型生成IQD文件

    很多Cognos的新手在接触Transform建模的时候对于iqd文件都有一种朦胧的感觉,当然也不必去死记硬别它的格式,下面我们就来说一下如何用Framework工具来生成iqd文件. 1:打开fra ...

  9. SDKStyle的Framework项目使用旧版项目文件生成的Nuget包遇到的问题

    随笔-2021-11-10 SDKStyle的Framework项目使用旧版项目文件生成的Nuget包遇到的问题 简介 C#从NetCore之后使用了新版的项目文件,SDK-Style项目,新版本的项 ...

  10. 第三篇:Entity Framework CodeFirst & Model 映射 续篇 EntityFramework Power Tools 工具使用

    上一篇 第二篇:Entity Framework CodeFirst & Model 映射 主要介绍以Fluent API来实作EntityFramework CodeFirst,得到了大家一 ...

随机推荐

  1. lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】

    一.lua变量[ 全局变量和局部变量和表中的域] Lua 变量有三种类型:全局变量和局部变量和表中的域. 全局变量:默认情况下,Lua中所有的变量都是全局变量. 局部变量:使用local 显式声明在函 ...

  2. RESTful API 为何成为顶流 API 架构风格?

    作者孙毅,API7.ai 技术工程师,Apache APISIX Committer 万物互联的世界充满着各式各样的 API ,如何统筹规范 API 至关重要.RESTful API 是目前世界上最流 ...

  3. List嵌套排序并取第一个对象

    using Newtonsoft.Json;using 嵌套List排序; //示例listvar exampleString = "{\"code\":1,\" ...

  4. 笔记:C++学习之旅---指针

    笔记:C++学习之旅---指针 为什么要使用指针 因为在操作大型数据和类时,由于指针可以通过内存地址直接访问数据,从而避免在程序中赋值大量的代码,因此指针的效率最高,一般来说,指针会有三大用途: 1: ...

  5. 深度学习-08(PaddlePaddle文本分类)

    深度学习-08(PaddlePaddle文本分类) 文章目录 深度学习-08(PaddlePaddle文本分类) NLP概述 NLP基本概念 什么是NLP NLP的主要任务 传统NLP方法 传统NLP ...

  6. Prism Sample 22-ConfirmCancelNavigation

    导航到一个视图,如果在离开这个视图时需要确认,在VM中实现以下接口 public class ViewAViewModel : BindableBase, IConfirmNavigationRequ ...

  7. 读《图解HTTP》

    最近读了一本书<图解HTTP>,读完后在大体上对HTTP协议有了更深层次的了解.以下是我以前不懂的问题,通过阅读此书后,这些问题都有了答案: 问题: URI和URL的区别? cookie到 ...

  8. 存下吧!Spring高频面试题总结

    Spring是什么? Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架. Spring的优点 通过控制反转和依赖注入实现松耦合. 支持面向切面的编程,并且把应用业务逻辑和系统 ...

  9. 2021-01-17:java中,HashMap底层数据结构是什么?

    福哥答案2020-01-07: 1.7 数组+链表重要字段://HashMap的主干数组,可以看到就是一个Entry数组,初始值为空数组{},主干数组的长度一定是2的次幂,至于为什么这么做,后面会有详 ...

  10. 2022-04-29:厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子: 吃掉一个橘子。 如果剩余橘子数 n 能被 2 整除,那么你可以吃掉 n/2 个橘子。 如果剩余橘子数 n 能被

    2022-04-29:厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子: 吃掉一个橘子. 如果剩余橘子数 n 能被 2 整除,那么你可以吃掉 n/2 个橘子. 如果剩余橘子数 n 能被 ...