🧩 HƯỚNG DẪN BUILD NATIVE AOT CHO WINFORMS (.NET 7/8/9)
Native AOT (Ahead-of-Time Compilation) là công nghệ cho phép bạn biên dịch ứng dụng WinForms thành file EXE native thuần, không còn phụ thuộc vào .NET Runtime như cách build truyền thống. Nhờ cơ chế biên dịch trực tiếp xuống mã máy, ứng dụng WinForms chạy nhanh vượt trội, thời gian khởi động gần như tức thì và tiêu thụ ít tài nguyên hơn.
Không chỉ giúp tối ưu hiệu năng, Native AOT còn mang lại khả năng bảo mật và chống dịch ngược (anti-reverse engineering) tốt hơn so với IL vì mã IL đã được loại bỏ trong quá trình biên dịch. Điều này đặc biệt hữu ích với các ứng dụng thương mại cần hạn chế việc bị phân tích, crack hoặc chỉnh sửa mã nguồn.
Nhờ những ưu điểm như hiệu suất cao, triển khai dễ dàng, độc lập với môi trường, Native AOT đang trở thành lựa chọn lý tưởng khi xây dựng ứng dụng WinForms hiện đại trên .NET 7/8/9. Đây cũng là xu hướng được Microsoft đẩy mạnh để tối ưu hóa trải nghiệm người dùng và giảm phụ thuộc vào runtime cài đặt của hệ thống.
Dưới đây là hướng dẫn đầy đủ, chi tiết và đúng kỹ thuật để bạn có thể build Native AOT cho WinForms C# (.NET 7 trở lên).
1️⃣ Cài đặt các thành phần cần thiết trong Visual Studio
Để Native AOT build thành công, bạn bắt buộc phải cài đủ 3 thành phần sau trong VS Installer → Modify → Workload: Desktop Development with C++.
✔ BẮT BUỘC phải tick:
1. MSVC v143 – C++ x64/x86 build tools
→ Linker backend của AOT cần MSVC toolchain.
2. Windows 11 SDK (10.0.22621.0 hoặc mới hơn)
→ Cung cấp header + libs cho Windows.
3. C++ CMake tools for Windows 🔥
→ Quan trọng nhất – nếu thiếu bạn sẽ bị lỗi:
- Platform linker not found
- cmake/ninja build step failed
- ILCompiler not found
- Build AOT dừng ở bước native codegen
CMake + Ninja chính là pipeline để AOT backend (ILCompiler) build native code.
✔ Không bắt buộc (có thể bỏ chọn để tiết kiệm dung lượng):
-
ATL / MFC
-
Clang tools
-
Boost.Test
-
Google Test
-
Address Sanitizer
-
v141 / v142 toolset
-
IntelliCode / Live Share
-
Windows SDK cũ (10.0.xxxx)
2️⃣ Cài NuGet package hỗ trợ Native AOT
Cài những NuGet package hỗ trợ Native AOT. Phần này quan trọng vì nhếu project chứa những Nuget không hỗ trợ Native AOT sẽ không tiến hành build được.
3️⃣ Chỉnh sửa file .csproj để bật Native AOT
Mở file .csproj và thêm vào:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <PropertyGroup> <!-- Bật Native AOT --> <PublishAot>true</PublishAot> <!-- WinForms có nhiều API chưa thân thiện trimming --> <_SuppressWinFormsTrimError>true</_SuppressWinFormsTrimError> <!-- Tùy chọn giảm dung lượng --> <InvariantGlobalization>true</InvariantGlobalization> <!-- Tắt Reflection bị trim --> <IlcDisableReflection>false</IlcDisableReflection> </PropertyGroup> |
4️⃣ Tạo file build.bat để build Native AOT
Tạo file build.bat trong thư mục project tại nơi có file .csproj ở bước 3
1 2 | dotnet publish -r win-x64 -c Release --self-contained PAUSE |
Nếu muốn build ARM64:
5️⃣ Tiến hành Build Native AOT
Chạy file: build.bat
Quá trình build có thể mất:
-
30–120 giây (project nhỏ)
-
2–5 phút (project lớn)
Native AOT compile native code nên lâu hơn build IL bình thường.
6️⃣ Thư mục xuất bản Native AOT
Sau khi build xong, output nằm tại:
bin\Release\net7.0-windows\win-x64\native\
Trong đó:
-
File .exe đã được native compile
-
Thư viện runtime đã được link tĩnh
-
Không còn .dll IL như build thường
7️⃣ Copy tài nguyên phụ của Project (nếu có)
Nếu project của bạn có:
-
Folder images
-
Folder Assets
-
File cấu hình .json
-
File .txt, .db, .ini
-
File resource bổ sung
→ Bạn tự copy vào thư mục publish hoặc cấu hình trong .csproj
8️⃣ Kiểm tra EXE Native AOT
File EXE:
-
Chạy không cần cài .NET Runtime
-
Size thường từ 10–40 MB
-
Launch cực nhanh
-
Không thể mở bằng ILSpy (đã native)
🎯 TÓM TẮT NHANH QUY TRÌNH
✔ Cài Visual Studio (3 mục bắt buộc)
-
MSVC v143
-
Windows 11 SDK
-
C++ CMake Tools for Windows
✔ Kiểm tra NuGet:
-
Xác định các nuget trong dự án có hỗ trợ Native Aot hay không.
✔ Sửa .csproj:
1 2 | <PublishAot>true</PublishAot> <_SuppressWinFormsTrimError>true</_SuppressWinFormsTrimError> |
✔ Build:
1 | dotnet publish -r win-x64 -c Release --self-contained |



