Upgrading to SDK-Style Projects
Required Reference: Before proceeding, consult the .NET SDK-style project documentation for authoritative guidance on SDK-style projects.
SDK Selection Guide
Analyze project files to recommend the appropriate SDK:
| Project Type | SDK | Indicators |
|---|---|---|
| Console/Library | Microsoft.NET.Sdk | No web/UI references |
| ASP.NET Core/Web API | Microsoft.NET.Sdk.Web | Microsoft.AspNetCore.*, Startup.cs, Controllers |
| Razor Class Library | Microsoft.NET.Sdk.Razor | .razor files, Razor components |
| Blazor WebAssembly | Microsoft.NET.Sdk.BlazorWebAssembly | Microsoft.AspNetCore.Components.WebAssembly |
| Worker/Background Service | Microsoft.NET.Sdk.Worker | IHostedService, BackgroundService |
| WinForms | Microsoft.NET.Sdk + <UseWindowsForms> | System.Windows.Forms |
| WPF | Microsoft.NET.Sdk + <UseWPF> | PresentationFramework, .xaml files |
| MSTest | MSTest.Sdk | Microsoft.VisualStudio.TestTools.UnitTesting |
| .NET Aspire AppHost | Aspire.AppHost.Sdk | Aspire orchestration project |
Analysis Checklist
Before upgrading, analyze and review:
- • Project type: Console, library, web, test, desktop, or worker
- • Target framework: Current TFM and desired target (e.g.,
net9.0,net48) - • Package references: Check
packages.configor<Reference>with HintPath - • Assembly references: GAC or local assemblies that need conversion
- • Conditional compilation:
#ifdirectives, DEBUG/RELEASE configurations - • Build configurations: Custom configurations beyond Debug/Release
- • Pre/Post build events: Scripts in
<PreBuildEvent>or<PostBuildEvent> - • Custom targets/props:
.targetsor.propsfile imports - • AssemblyInfo.cs: Attributes to migrate or auto-generate
- • Resources:
.resxfiles, embedded resources, content files - • Project references: Other projects in solution
- • COM references: ActiveX/COM interop dependencies
- • WCF/ASMX references: Service references requiring migration
- • Project GUIDs: Solution file references (update if changing)
- • Output paths: Custom
OutputPath,IntermediateOutputPath - • Signing: Strong name keys, delay signing settings
- • Platform target: x86, x64, AnyCPU, ARM settings
Upgrade Process
- •
Identify SDK: Analyze references and file patterns to determine SDK
- •
Create minimal project file:
xml<Project Sdk="SELECTED_SDK"> <PropertyGroup> <TargetFramework>net9.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> </PropertyGroup> </Project> - •
Add OutputType if executable:
<OutputType>Exe</OutputType>or<OutputType>WinExe</OutputType> - •
Migrate PackageReferences: Convert
packages.configor HintPath references - •
Remove redundant elements: SDK-style auto-includes
*.cs,*.resx, etc. - •
Add desktop properties for WinForms/WPF:
xml<UseWindowsForms>true</UseWindowsForms> <!-- or --> <UseWPF>true</UseWPF>
Key Differences from Legacy
- •No
<Compile Include="**/*.cs" />needed (auto-included) - •No assembly info file needed (
<GenerateAssemblyInfo>true</GenerateAssemblyInfo>default) - •PackageReference replaces packages.config
- •No ProjectGuid, ProjectTypeGuids required
- •No explicit SDK imports needed
Validation
After upgrade, run:
bash
dotnet build dotnet msbuild -preprocess:output.xml # View expanded project