Sửa lỗi: Không tìm thấy framework 'Microsoft.WindowsDesktop.App' trong .NET

beginner🪟 Windows2026-07-23| Windows 10/11, Windows Server 2019/2022, .NET Core 3.1, .NET 5, .NET 6, .NET 7, .NET 8+

Error Message

It was not possible to find any compatible framework version. The framework 'Microsoft.WindowsDesktop.App', version 'X.X.X' (x64) was not found.
#.net#dotnet-runtime#wpf#windows-server#khac-phuc-loi

Tình huống lỗi

Gần đây tôi đã gặp phải vấn đề này khi triển khai một công cụ WPF (Windows Presentation Foundation) nhỏ lên một instance Windows Server 2022 mới. Mặc dù .NET 8 SDK đã được cài đặt, ứng dụng vẫn không khởi chạy được. Thay vì giao diện người dùng như mong đợi, tôi nhận được một lỗi CLI và một hộp thoại thông báo rằng không thể tìm thấy phiên bản framework tương thích.

It was not possible to find any compatible framework version. 
The framework 'Microsoft.WindowsDesktop.App', version '8.0.0' (x64) was not found.

Điều này xảy ra vì .NET chia hệ sinh thái của mình thành nhiều loại khác nhau. Runtime "Base" (Cơ bản) xử lý các ứng dụng console và backend web, trong khi runtime "Desktop" chứa các thư viện giao diện người dùng cụ thể cho WinForms hoặc WPF. Nếu bạn chỉ cài đặt runtime tiêu chuẩn hoặc SDK, hệ thống của bạn sẽ thiếu các file DLL cần thiết để hiển thị các cửa sổ và nút bấm.

Tại sao framework lại bị thiếu?

Thông thường, vấn đề nằm ở một trong ba trở ngại phổ biến sau:

  • Sai loại Runtime: Có khả năng bạn đã cài đặt ".NET Runtime" thông thường (khoảng 25MB đến 30MB) thay vì ".NET Desktop Runtime" (thường trên 55MB), phiên bản bao gồm các thành phần bổ sung dành riêng cho Windows.
  • Không tương thích kiến trúc: Ứng dụng của bạn có thể được biên dịch cho hệ thống 32-bit (x86). Nếu bạn chỉ cài đặt runtime 64-bit (x64), ứng dụng sẽ không nhận diện được.
  • Chi tiết phiên bản: Ứng dụng có thể đang tìm kiếm một phiên bản phụ cụ thể, ví dụ 6.0.25. Nếu bạn chỉ có 6.0.0 và không có chính sách "roll-forward" nào được kích hoạt, ứng dụng sẽ thất bại.

Cách khắc phục nhanh: Cài đặt Desktop Runtime

Giải pháp trực tiếp nhất là tải xuống trình cài đặt Desktop Runtime cụ thể. Tránh nhấp vào liên kết "Download" đầu tiên bạn thấy trên trang web của Microsoft, vì liên kết đó thường trỏ đến phiên bản dành riêng cho máy chủ (Server).

  • Truy cập trang tải xuống .NET chính thức.
  • Chọn phiên bản được đề cập trong lỗi của bạn (ví dụ: .NET 6.0 hoặc .NET 8.0).
  • Tập trung vào cột có tiêu đề "Run desktop apps".
  • Tải xuống trình cài đặt x64 cho hầu hết các máy tính hiện đại. Nếu lỗi của bạn đề cập cụ thể đến (x86), hãy tải xuống phiên bản đó.
  • Chạy file .exe, và bạn thậm chí không cần khởi động lại máy; chỉ cần khởi động lại ứng dụng của bạn.

Chiến lược triển khai tốt hơn

1. Kiểm tra các Runtime đã cài đặt

Hãy xem hệ thống của bạn thực sự nhận diện được những gì trước khi cài đặt thêm các trình cài đặt khác. Mở PowerShell và chạy lệnh sau:

dotnet --list-runtimes

Một máy tính hoạt động bình thường và sẵn sàng cho các ứng dụng desktop sẽ hiển thị cả base app và desktop app trong danh sách. Nếu thiếu Microsoft.WindowsDesktop.App, bạn đã tìm ra nguyên nhân. Kết quả đúng sẽ trông như thế này:

Microsoft.NETCore.App 8.0.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.WindowsDesktop.App 8.0.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

2. Giải quyết xung đột kiến trúc

Đừng giả định rằng bản cài đặt Windows 64-bit chỉ cần các runtime 64-bit. Nếu ứng dụng cũ của bạn được biên dịch cho x86, nó sẽ không nhận diện được runtime x64. Bạn có thể cài đặt cả hai phiên bản x86 và x64 của Desktop Runtime song song với nhau. Điều này thường cần thiết cho các công cụ doanh nghiệp cũ chưa được cập nhật lên tiêu chuẩn 64-bit hiện đại.

3. Dành cho lập trình viên: Sử dụng Self-Contained Publishing

Bạn mệt mỏi vì người dùng phàn nàn về việc thiếu runtime? Bạn có thể đóng gói toàn bộ .NET runtime bên trong file .exe của mình. Điều này làm tăng kích thước file—thường từ 200KB lên 60MB hoặc hơn—nhưng nó đảm bảo ứng dụng hoạt động ngay lập tức trên bất kỳ máy nào.

Sử dụng lệnh này để build một file duy nhất, độc lập:

dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true

4. Ép buộc chính sách Roll-Forward

Nếu ứng dụng của bạn yêu cầu phiên bản 6.0.2 nhưng bạn đã cài 6.0.28, bạn có thể buộc nó sử dụng phiên bản mới hơn. Tìm file appname.runtimeconfig.json trong thư mục ứng dụng của bạn. Bằng cách thêm cài đặt rollForward, bạn thông báo cho .NET bớt khắt khe hơn về các số phiên bản phụ.

{
  "runtimeOptions": {
    "tfm": "net6.0",
    "framework": {
      "name": "Microsoft.WindowsDesktop.App",
      "version": "6.0.0"
    },
    "rollForward": "LatestFeature"
  }
}

Xác nhận khắc phục lỗi

Chạy dotnet --list-runtimes một lần cuối để xác minh framework Desktop App đã hiện diện. Khi bạn khởi chạy ứng dụng, giao diện người dùng sẽ mở ngay lập tức. Nếu nó vẫn thất bại mà không báo lỗi, hãy kiểm tra Windows Event Viewer trong mục Windows Logs > Application để xem liệu có file DLL nào khác gây ra sự cố hay không.

Related Error Notes