.NET直接编译成本地代码:.NET Native架构简介

告别CLR!用.NET 8的Native AOT把C#代码打包成纯原生DLL,让C++项目直接调用 本文详细介绍了如何利用.NET 8的Native AOT技术将C#代码编译为纯原生DLL,使C++项目能够直接调用,无需依赖CLR运行时。通过实战示例和性能对比,展示了Native AOT在启动速度、内存占用和跨语言互操作方面的显著优势,为开发者提供高效的解决方案。 阅读详情

这篇Blog好久没有更新了。最近一直在忙.NET Native相关的事情(主要是MCG),但是又因为保密的原因不能在Blog中提到。上个星期Build终于发布(可惜没有去成,team名额太少),我也终于可以谈下.NET Native的一些东西了,呵呵。



如果大家还没有看到之前的发布信息,可以去下面几个网址看看:


.NET Native首页

.NET Native发布的blog


如果英文听力不错的话,可以听一下我们team principal dev lead的talk(其实他的英文比较难懂,速度快。。。):


Inside .NET Native Talk


这里简单讲一下.NET Native的基本架构,基本内容和上面那个talk其实差不多,只是简单给大家讲一下.NET Native的一些基本概念。如果大家有对某个部分具体感兴趣,也可以提出来,我尽量在我能力范围内解答(毕竟不是我一个人做的,呵呵)或者写新的Blog详细解释。


.NET Native和之前的NGEN有本质区别。NGEN实际上是把CLR运行时的数据结构和代码给一锅端(当然,这个是简化的说法,实际上比这个复杂)的放到最终的PE里面去了,运行的时候还是需要整个.NET Framework支持,而且不能避免JIT。.NET Native是全新的技术,整个.NET Framework经过refactoring重写,最终的runtime非常小,只有数百K,无需任何安装(除了mrt100.dll之外,大家可以理解成msvcrt.dll)。大部分的功能都从runtime中refactor到framework中作为C#代码或者作为toolchain一部分存在。一个典型的例子是:P/invoke原来是由CLR实现,使用C++和汇编编写。而现在是经由MCG这个工具接手,直接生成C#。最终.NET Native生成的EXE/DLL是可以直接运行的机器码(通过C++编译器后端生成)。对了,有些朋友可能会问:我们是不是直接生成C++代码?答案是否定的。我们所使用的C++编译器后端接受IL作为输入,生成MDIL。


整个Toolchain(工具链)大致可以分为下面几个阶段:


App IL + FX -> MCG -> Interop.g.cs -> CSC -> Interop.dll -> Merge -> IL transform -> NUTC -> RhBind -> .EXE


第一步:将应用程序的IL代码和整个.NET Framework BCL的IL一起作为输入给MCG。MCG (Marshalling Code Generator)这一块主要是我在负责。这个工具负责检查程序和BCL中所有的Interop相关的类型,比如WinRT接口,P/Invoke,等等。MCG都会为之生成C#代码。这个C#代码是可以直接调试的,有兴趣的朋友可以F11试一下看看。C#代码的作用主要是替代Windows.WinMD中的WinRT类型定义,P/invoke定义,等等,添加各种类型的转换代码,比如字符串类型,RCW和CCW,等等,最终直接调用到本地代码。可能有些朋友会问道:为什么要生成C#? 原来的CLR是直接在运行时生成IL代码的,但是显然这个方法在.NET Native不太适用,而且IL代码很难调试。C#既方便大家调试,也方便我们快速的修改生成的代码,添加更多的功能。(写C++程序生成IL代码可是比较麻烦的,得人工算好stack的位置)
第二步:MCG生成的C#代码通过CSC编译,生成PE文件。这一步没啥可讲的。
第三步:这个PE文件被打包合并到应用程序和BCL,生成一个IL代码的集合。为下一步做好准备。

第四步:这个IL代码的集合会被经过若干的步骤处理,每个步骤都相对简单,只做一件事情。这些步骤的主要作用是提供原来CLR运行时提供的功能,最终的目的是使之最后的代码能够被C++最后编译。在原来桌面版本的CLR里面(也就是4.5里面的那个),很多功能是由Runtime来提供,比如Delegate.Invoke,比如interop。这些Transform的作用是对代码进行处理,把原来需要runtime实现的部分用实际代码替换掉。举个几个例子:

1. 当你在调用Windows.UI.Xaml.Controls.Button类型的时候,MCG也会生成一个对应的Button类型,然后IL Transform会将两者进行替换,这样程序调用的Button类型就是MCG生成的代码了。

2. 当你在进行Serialization和Deserialization的时候,IL Transform会调用另外一个工具SG来生成serialization/deserialization的C#代码,最终这些操作都有这些C#代码生成。

3. 你的程序多半不会用到整个BCL。IL Transform中会有一步叫做Dependency Reducer,使用类似GC的算法(mark->sweep),去掉不需要的代码。MCG也和DR通力合作,减少不必要的interop代码生成。DR也会读取RD.XML文件,决定那些类型需要反射信息,那些不需要。RD.XML这一块我们还在改善之中,也希望大家多提宝贵意见。

其实呢,MCG其实也是IL Transform的一部分,只不过它实际上不Transform而已,而是直接生成C#。


第五步:NUTC对IL进行处理,生成MDIL。NUTC就是传说中的C++的编译器后端的一个特殊版本,优化什么的就靠它了。最后生成的MDIL接近机器码,但是也包含一些抽象的类型信息,需要进一步处理。
第六步:RhBind负责对MDIL进行处理,将里面和类型系统相关的信息生成代码,最后生成一个EXE。其实最终是一个EXE+DLL,实际的代码都在DLL中。EXE只是起到Bootstrap的作用。选用DLL的原因是我们需要支持作为Background Task在Broker里面加载。

几个我听到的常问的问题(如果有些答案过于“官方”,请谅解):

1. 你们最后是生成C++代码吗?

答:不生成。C++后端直接从IL转换成MDIL。

2. WPF支持吗?

答:暂时不支持。目前暂时只支持Windows Store Apps

3. 这个会支持桌面程序吗?

答:目前暂时只支持Windows Store Apps

4. 这个支持JIT吗?

答:目前.NET Native不支持JIT,所有代码都是编译时候生成。

5. 既然是本地机器码,为什么还可以支持类型反射(reflection)?

答:机器码和反射并不冲突,我们在PE文件中储存了额外的用于反射的信息,然后动态读取此信息进行调用。C++也可以支持反射(RTTI),只是不如.NET强大而已。

6.这个需要安装.NET Framework吗?

答:开发编译的时候需要,运行时不需要。

7.为什么不支持VB

答:VB本质上和C#都是生成IL,技术上非常类似。只是目前我们因为时间问题,暂只支持C#。

8.为什么启动运行速度会变快?

答:一方面归功于C++的优秀的编译器后端,一方面也因为runtime的重写和简化。


这次就大概讲这么多。欢迎大家试用一下.NET Native,去下面几个地方给我们提一下意见:


.NET Native官方论坛

dotnetnative@microsoft.com


如果不想写英文的话(其实写中文也行),也可以直接在本blog留言。


--
张羿
.NET Native



将C#程序编译成Native代码:解锁高性能的新世界 在传统的认知中,C# 通常被视为一种托管语言,运行于 .NET 运行时之上。然而,随着技术的发展,现在可以通过多种方式将 C# 程序编译成原生(native)代码,从而获得更高的性能和更低的资源消耗。本文将详细介绍如何将 C# 程序编译成 native 代码,并探讨其应用场景及优势。 阅读详情

相关推荐

强化.NET程序安全:防止反编译的最佳实践

NET框架因其高效的代码管理和可移植性,已成为开发跨平台应用程序的首选。然而,应用程序在发布后往往面临着被反编译的风险。反编译不仅使源代码暴露给潜在的竞争对手,还可能导致安全漏洞和知识产权的损失。因此,防止.NET应用程序被反编译是任何希望保护其软件资产的开发者必须面对的课题。为了有效防止.NET应用程序被反编译,开发者需要采取一系列策略,这些策略包括但不限于代码混淆、代码加密、使用强名称签名等。

weixin_30021053的博客 1274

.NET Native:将.NET应用编译为原生应用

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34216036的博客 541

【自然语言处理】【聚类】TELL:可解释神经聚类

超越分类的XAI:可解释神经聚类 《XAI Beyond Classification: Interpretable Neural Clustering》 论文地址:https://www.jmlr.org/papers/volume23/19-497/19-497.pdf 一、简介 ​ 本文研究了可解释AI(XAI\text{XAI}XAI)和数据聚类这两个挑战性问题。第一个问题是如何设计一种具有固定可解释性的神经网络,而不是给出一个黑盒模型的事后解释。第二个问题是,使用可微分神经网络来实现离散的k-me

bqw的博客 4133

初识.NET 的 Native AOT

UWP(Universal Windows Platform,通用Windows平台)是微软开发的一套应用程序平台和技术,旨在让开发者能够创建可以在所有支持的Windows 10设备上运行的应用程序。个人电脑(PC)平板电脑手机Xbox游戏机Surface Hub(大型协作显示器)HoloLens(混合现实头戴式显示器)Windows Mixed Reality设备。

橙-极纪元-JJYCheng 1036

阿里巴巴达摩院人工智能训练师(高级)

阿里巴巴达摩院人工智能训练师(高级)

huang0612123的博客 1万+

Ansys -PEmag 平面变压器仿真与circuit电路模型验证

ansys 软件集成了电路、磁路、PCB参数提取,结构参数提取等功能仿真,基于内置模块的功能参数的仿真后可以提取出主要关键参数,寄生参数,频域响应参数等。该软件的优势在于能够将所有的仿真参数导出为电路模型文件,可以在自带的模块中仿真也可以导出在其他第三方软件中仿真,比如matlab-simulink文件扥。主要介绍ANSYS插件的使用,对PEmag做了详细使用说明并通过案例得到对用的变压器参数;基于变压器参数再将其磁路模型导入到电路中进行建模仿真,实现PEmag与circuit的联合仿真。

weixin_41609745的博客 3013

.NET Native AOT的静态库与动态库

.NET不仅可以使用 C静态库与动态库,也可以将.NET实现的函数导出为C静态库与动态库。在没有Native Aot之前,.NET只能通过P/Invoke享受C/C++生态,而在Native Aot之后,不仅可以享受这些生态,还可以开发SDK供其他语言调用。 .NET Native AOT的NativeLib参数用于指定本机库的类型。在.NET 7中,该参数有两个选项:Static和Shared...

冯辉 3016

N5105 PVE UEFI核显直通Windows:从黑屏到HDMI输出的实战调优

本文详细介绍了在N5105处理器上实现PVE UEFI核显直通Windows的实战调优方法。针对黑屏和HDMI音频无法识别等常见问题,提供了系统参数调整、驱动模块加载、虚拟机配置等解决方案,帮助用户成功实现核显直通并优化性能。

weixin_42566424的博客 203

什么是.NET Native?

使用CoreRT将.NET Core发布为Native应用程序 - KAnts - 博客园 http://www.cnblogs.com/ants/p/8630332.html Microsoft .NET Native 常见问题https://msdn.microsoft.com/zh-cn/vstudio/dn642499.aspx .NET Native 入门 | Microsoft ...

weixin_30262255的博客 803

vue3接入大华摄像头

┃ ┃ ┣ 📜PlaybackModal.vue 回放列表模态框。┃ ┃ ┗ 📜VideoGrid.vue 视频播放区域。┃ ┃ ┣ 📜ControlPanel.vue 控制面板。┃ ┃ ┣ 📜DeviceList.vue 设备列表。┃ ┣ 📂module //大华摄像头文件。

💻 专注 Vue 前端与 Java 后端技术 🌱 目前正在深入 Spring Boot、微服务与性能优化 📝 定期分享实战踩坑经验与学习笔记 🤝 欢迎交流,共同进步 913

⚡【C++要笑着学】(13) STL介绍:什么是STL标准模板库 | STL的版本 | 浅谈STL的缺陷

再讲解函数模板之前先对STL做一个小铺垫,本篇将对STL做一个简单的介绍。

有道无术, 术尚可求。有术无道, 止于术。 3033

c# .NET 的 Native AOT与java性能对比

c# .NET 的 Native AOT与java性能对比;.NET的NativeAOT(Ahead-of-Time)跨平台编译技术是实现这一性能提升的核心。与传统的编译方式不同,NativeAOT在开发人员的计算机上就将C#代码直接编译为本机代码。以往,Java开发APP时,需经过多个步骤,从Java代码编译成字节码,再通过Java虚拟机在运行时将字节码转换为机器码,这一过程涉及大量的解释和转换工作,产生了额外的性能开销。“

橙-极纪元-JJYCheng 1906

Dify与第三方平台(飞书、微信、钉钉)LangBot机器人对接实战

调用链路:飞书用户发消息 → 飞书开放平台事件回调 → LangBot 服务 → Dify 应用接口 → Dify 知识库 + 大模型生成答案 → 原路返回飞书聊天框Dify:承载知识库、提示词配置、大模型调用能力;LangBot:多 IM 渠道适配器,统一对接各大 IM 开放平台与 Dify API;飞书开放平台:提供机器人消息收发、事件推送能力。LangBot 作为中间转发服务,一端对接 Dify 应用 API,一端对接飞书开放平台机器人接口;

悦分享 266

微软宣布 .NET Native 预览版 C#可编译为本地机器码

英文原文:Announcing .NET Native Preview 微软在 MSDN 博客上宣布了 .NET Native 的开发者预览版。.NET Native 可以将 C# 代码编译成本地机器码。有了它,开发者将不仅能享受 C# 的高生产力,而且能拥有 C++ 般的性能。鱼与熊掌不可兼得,而有了 NET Native,我们都可以兼得 C# 的生产力与 C++ 的战斗力。使用

开源控Meteor的博客 1519

AI Agent开发大全第二十课-如何开发一个MCP(从0开发一个MCP Server)

大模型的MCP火了,可是无论是Claude官网本身自带Sample还是全网任何一本教程没有一个可以真正应用在生产环境中的。要么就是只能在本地以文件IO流的方式运行要么干脆连编译都出错,真正的mcp server和client是怎么编写的?如何运行在分布式环境?本教程就带大家真正从0开始以“AI计算食物热量“为例带大家真正学习mcp开发的全过程。

打造全国最全的AI Agent开发知识领域的博客 1801

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

.NET 的 Native AOT 现在是什么样的?

在软件开发领域,优化性能和简化效率仍然至关重要。多年来,.NET 平台一直在创新,为开发人员提供基础设施,以打造弹性和高效的软件解决方案。今天要写的这篇文章源自昨天在朋友圈发的文章《UWP 通过 .NET 9 和Native AOT 的支持实现 UWP 应用的现代化》[1],一位小伙伴的对话让我想全面梳理下Native AOT的现在的进展。什么是 .NET Native AOT?.NET Nat...

weixin_40692378的博客 818

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

基于.NET 11 的 Native AOT 优化 Blazor 客户端应用的性能

借助.NET 11 的 Native AOT 技术,能够有效优化 Blazor 客户端应用的性能,为用户带来更流畅的体验。通过深入理解其原理,在实践中合理运用并避免常见的坑点,开发者可以充分发挥这一技术的优势。随着技术的不断发展,Native AOT 有望在 Blazor 应用开发中得到更广泛的应用。

dotnethello的博客 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

*Native AOT:像预制菜一样的代码编译

使用Native AOT就像经营连锁快餐店优势:出餐极快、口味一致、分店容易开(部署简单)代价:不能现场定制、前期准备时间长(编译时间长)、菜单固定关键建议从小处开始:先拿一个命令行工具试试了解你的食材:清楚每个依赖库的AOT兼容性提前设计:不要等应用复杂了再考虑AOT拥抱新工具:源生成器是你的好帮手接受限制:不是所有应用都适合,就像不是所有餐厅都适合做快餐Native AOT是C#生态的重要进化,它让C#应用能在更多场景与Go、Rust等竞争。

leohu0723的博客 1474

.NET 10 Native AOT 最新进展:架构演进、性能范式与生态系统重塑

这种架构通过中间语言(IL)实现了“一次编写,处处运行”的承诺,并赋予了平台强大的动态特性,如运行时反射、动态代码生成以及基于运行时配置文件的代码优化(Dynamic PGO)。在.NET 的泛型实现中,引用类型(Reference Types)的泛型实例化通常共享同一套机器码(例如 List<string> 和 List<object> 在底层共享代码),但值类型(Value Types)的实例化(如 List<int> vs List<float>)传统上需要为每种类型生成独立的代码副本。

dotNET跨平台 828

微软宣布.NET Native预览版 C#可编译为本地机器码

微软宣布.NET Native预览版 C#可编译为本地机器码 投递人 itwriter 发布于 2014-04-03 17:05 评论(70) 有6766人阅读  原文链接  [收藏]  « »   英文原文:Announcing .NET Native Preview   微软在 MSDN 博客上宣布了 .NET Native 的开发者预览版。.NET

tyb1222的专栏 2128

30 分钟把平板改成压感数位板:Weylus 从连通到调优

Weylus 是一个开源工具,把 iPad 或安卓平板变成电脑的数位板和触摸屏:电脑画面实时投到平板,笔的压感、倾斜和多指触控直接驱动桌面软件。不想买数位板、常做手写批注或课堂演示的人,可以照着走完装环境、连网、开压感的每一步。 [![Weylus 平板数位板演示:笔尖落点从平板同步绘制到电脑屏幕](https://raw.gitcode.com/gh_mirrors/we/Weylus/raw

gitblog_00842的博客 979

C# native

转自:http://www.it165.net/pro/html/201404/12833.html Microsoft .NET Native Developer Preview 内部初探(1) MS 前段时间发布了.NET Native Developer Preview,被广大人员赋予“C++的性能,.NET的生产力”之期望。我们暂时不管此技术现在是否有价值的

threadroc的专栏 5929

.NET Native AOT 的发展现状如何?

在软件开发领域,优化性能和简化效率仍然至关重要。多年来,.NET 平台一直在创新,为开发人员提供基础设施,以打造弹性和高效的软件解决方案。今天要写的这篇文章源自昨天在朋友圈发的文章《UWP 通过 .NET 9 和Native AOT 的支持实现 UWP 应用的现代化》[1],一位小伙伴的对话让我想全面梳理下Native AOT的现在的进展。什么是 .NET Native AOT?.NET Nati...

farway000的博客 524
上一篇: .NET 4.0新功能:Mscoree.dll + Mscoreei.dll=更少的Reboot (上)
ATField
博客等级 码龄25年 673粉丝 119原创
评论 89
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值