Thiết lập môi trường phát triển, biên dịch và gỡ lỗi dự án .NET trên Visual Studio Code

1. Cài đặt Visual Studio Code và Extension

Khi tải Visual Studio Code, hãy ưu tiên chọn bản System Installer (nằm trong phần Other platforms). Việc sử dụng bản User Installer đôi khi dẫn đến xung đột kiến trúc (32-bit/64-bit) với .NET runtime, khiến trình gỡ lỗi không thể khởi chạy. Sau khi cài đặt thành công, truy cập vào tab Extensions, tìm kiếm và cài đặt gói C# chính chủ của Microsoft.

2. Thiết lập .NET SDK và .NET Framework

Tiến hành cài đặt .NET Core SDK. Lưu ý chọn phiên bản SDK tương thích với yêu cầu của dự án (ví dụ: một số dự án hoặc engine cũ yêu cầu phiên bản 2.2.x và không hỗ trợ nâng cấp trực tiếp lên 3.0).

Nếu dự án yêu cầu .NET Framework (chẳng hạn 4.7.1 hoặc 4.8), bạn cần tải và cài đặt bản Developer Pack tương ứng từ trang chủ Microsoft. Sau khi cài đặt, kiểm tra lại trong Control Panel để đảm bảo cả SDK và Targeting Pack đã xuất hiện.

3. Cấu hình biến môi trường MSBuild

Để hệ thống nhận diện đúng các SDK của .NET, bạn cần thiết lập biến môi trường trong Windows:

  • Tên biến: MSBuildSdksPath
  • Giá trị: Đường dẫn đến thư mục Sdks trong thư mục cài đặt SDK của bạn (Ví dụ: C:\Program Files\dotnet\sdk\2.2.300\Sdks).

4. Quản lý phiên bản SDK với global.json

Trong trường hợp máy tính cài đặt nhiều phiên bản .NET SDK khác nhau, bạn cần cố định phiên bản sử dụng cho từng dự án cụ thể để tránh lỗi biên dịch. Sử dụng file global.json để thực hiện việc này.

Mở terminal tại thư mục gốc của dự án và chạy lệnh:

dotnet new globaljson --sdk-version 2.2.300

Sau đó, kiểm tra phiên bản hiện tại đang được áp dụng cho thư mục này bằng lệnh:

dotnet --version

Bạn có thể tạo các file global.json với phiên bản khác nhau cho từng dự án riêng biệt. Để xem danh sách tất cả SDK đã cài đặt, sử dụng lệnh dotnet --info.

5. Tải và đồng bộ dự án

Khi mở một thư mục bằng Visual Studio Code, IDE sẽ tự động tạo thư mục ẩn .vscode và quét các file .sln hoặc .csproj trong thư mục đó cùng các thư mục con để tải vào môi trường phát triển.

  • Dự án Unity: File giải pháp (.sln) và project (.csproj) sẽ được tự động sinh ra khi cấu hình đúng extension.
  • Dự án thuần .NET: Cài đặt thêm extension vscode-solution-explorer để dễ dàng tạo và quản lý các solution/project trực tiếp trên giao diện IDE.

Lưu ý: Nếu dự án đã từng được biên dịch trước đó, hãy xóa toàn bộ thư mục objbin trong các project, sau đó mở lại VS Code và thực hiện lệnh Restore để tải lại các package.

6. Cấu hình Debug và Build Tasks

Để biên dịch và gỡ lỗi, bạn cần thiết lập file launch.jsontasks.json trong thư mục .vscode. Nếu các file này đã tồn tại nhưng bị lỗi, hãy xóa đi và tạo lại từ đầu thông qua Debug Panel.

Dưới đây là cấu hình mẫu cho launch.json để biên dịch và attach debugger vào một ứng dụng console:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug GameServer (Console)",
            "type": "coreclr",
            "request": "launch",
            "preLaunchTask": "compile-server",
            "program": "${workspaceFolder}/Output/GameServer.dll",
            "args": ["--env", "development"],
            "cwd": "${workspaceFolder}/Output",
            "console": "integratedTerminal",
            "stopAtEntry": true
        },
        {
            "name": "Attach to Process",
            "type": "coreclr",
            "request": "attach",
            "processId": "${command:pickProcess}"
        }
    ]
}

Tiếp theo, cấu hình tasks.json để định nghĩa các lệnh build. Điểm quan trọng là sử dụng thuộc tính dependsOn để đảm bảo các project phụ thuộc được biên dịch trước:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "compile-core",
            "command": "dotnet",
            "type": "process",
            "args": [
                "build",
                "${workspaceFolder}/Source/Core/Core.csproj",
                "/property:GenerateFullPaths=true",
                "/consoleloggerparameters:NoSummary"
            ],
            "problemMatcher": "$msCompile"
        },
        {
            "label": "compile-server",
            "command": "dotnet",
            "type": "process",
            "dependsOn": [
                "compile-core"
            ],
            "args": [
                "build",
                "${workspaceFolder}/Source/Server/GameServer.csproj",
                "/property:GenerateFullPaths=true",
                "/consoleloggerparameters:NoSummary"
            ],
            "problemMatcher": "$msCompile"
        },
        {
            "label": "deploy-release",
            "command": "dotnet",
            "type": "process",
            "args": [
                "publish",
                "${workspaceFolder}/Source/Server/GameServer.csproj",
                "-c", "Release",
                "/property:GenerateFullPaths=true"
            ],
            "problemMatcher": "$msCompile"
        },
        {
            "label": "hot-reload",
            "command": "dotnet",
            "type": "process",
            "args": [
                "watch",
                "run",
                "--project",
                "${workspaceFolder}/Source/Server/GameServer.csproj"
            ],
            "problemMatcher": "$msCompile"
        }
    ]
}

Trong cấu hình trên, task compile-server khai báo "dependsOn": ["compile-core"]. Điều này có nghĩa là khi bạn kích hoạt task build server, hệ thống sẽ tự động gọi task build core trước để đảm bảo mọi thư viện cốt lõi được cập nhật mới nhất.

Thẻ: visual-studio-code dotnet-core csharp msbuild global-json

Đăng vào ngày 17 tháng 9 lúc 01:10